2017-05-09 7 views
1

와 PNG 이미지에서 사용자 정의 클릭 모양의 버튼을 구현 I 투명성 다음과 같은 PNG 이미지가 있습니다HTML - 투명성

Button image

내가 HTML & CSS 그 용도에 버튼을하고 싶습니다를 alpha 채널을 마스크로 사용하여 사용자가 분홍색 영역을 클릭하는 경우에만 작동합니다.

그럴 수 있습니까? 어떻게 구현 될 수 있습니까?

+1

그게 사용자에게 어색한 짓을하는 한 가지 방법입니다 - 버튼의 특정 영역을 클릭하여 작동 시키려면 ... 사용자 편의성을 높이십시오! –

+0

작은 게임을 실행하는 웹 앱이있는 양방향 웹 사이트의 경우 이미지는 극단적 인 예입니다! –

+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

답장을 보내 주셔서 감사합니다. 자바 스크립트 코드 주석이 도움이됩니다! 프런트 엔드로 전환하는 프로그래밍 배경에서 왔습니다 # 원더풀! –