2017-05-09 20 views
1

とPNG画像からカスタムクリッカブル形状のボタンを実装、私は透明度以下PNGイメージがありますHTML - 透明性

Button image

を私は使用していますHTML & CSSでボタンを作りたいですalphaチャネルをマスクとして使用するため、ユーザーがピンク領域をクリックした場合にのみ機能します。

これは可能ですか?どのように実装できますか?

+1

これは、ユーザーにとって厄介なことをする1つの方法です。ボタンの特定の領域をクリックして動作させる必要があります。ユーザーの利便性を高めましょう! –

+0

それは、小さなゲームを実行しているWebアプリケーションを持っているインタラクティブなウェブサイトのためのものです、イメージは単なる極端な例です! –

+0

@Andreww誰かがあなたの問題を解決しましたか?もしそうなら、あなたは最高の答えを受け入れてください(ポイントの下にあるチェックマークをクリックしてください)。それはあなたの質問に出くわす他のユーザーがすぐに受け入れられた答えを見つけるのを助け、15人の担当者も与えます。著者:( – Danziger

答えて

0

あなたはピクセル値を取得し、アルファチャンネル値をチェックするためにcanvasにあなたのイメージを描画する必要がHTML map Tag

+0

)シンプルで静的な使用例ではうまくいくが、将来的に変更される可能性がある場合は、それが任意の形状/画像に対して適切な解決策ではないと思う。画像のアルファチャンネルを考慮して手動で定義する必要があります。 – Danziger

0

イメージマップをチェックアウトする場合があります:

const messageBox = document.getElementById('messageBox'); 
 
const imageButton = document.getElementById('imageButton'); 
 
const canvas = document.createElement('canvas'); 
 
const context = canvas.getContext('2d'); 
 
const width = imageButton.width; 
 
const height = imageButton.height; 
 

 
canvas.width = width; 
 
canvas.height = height; 
 

 
context.drawImage(imageButton, 0, 0, width, height); 
 

 
imageButton.onclick = function(e) { 
 
    const alpha = context.getImageData(e.offsetX, e.offsetY, 1, 1).data[3]; 
 
    
 
    switch (alpha) { 
 
    case 255: 
 
     messageBox.innerText = "Inside clicked"; 
 
     
 
     break; 
 
     
 
    case 0: 
 
     messageBox.innerText = "Outside clicked"; 
 
     
 
     // Here you could do e.preventDefault(); if this is a form submit event or something like that. 
 
     
 
     break; 
 
     
 
    default: 
 
     messageBox.innerText = "Border clicked."; 
 
     
 
     // Decide how to handle clicks in the border or change the switch for an if and define a range of valid and invalid values for the alpha channel. 
 
     
 
     break; 
 
    } 
 
};
#imageButton { 
 
    box-shadow: inset 0 0 0 1px rgba(255, 0, 0, .5); 
 
    cursor: pointer; 
 
    width: 100px; 
 
}
<img id="imageButton" src="data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7" /> 
 

 
<div id="messageBox"></div>

Cross-Originの問題や許可されている以上の回答を避けるために、画像の代わりに小さなデータURIを使用しています。

+1

返信いただきありがとうございます。JavaScriptコードのコメントは非常に役に立ちます!私はac#プログラミングのバックグラウンドからフロントエンドに切り替えることができました。 –