Vous devez dessiner votre image dans un canvas
pour obtenir les valeurs de pixel et vérifier la valeur du canal alpha:
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>
Remarque J'utilise un petit URI de données au lieu de votre image pour éviter les problèmes Cross-Origin
ou une réponse supérieure à celle autorisée.
c'est une façon de rendre les choses difficiles pour l'utilisateur - d'avoir à cliquer sur une zone spécifique d'un bouton pour que cela fonctionne ... rafraîchissez-vous sur la convivialité! –
c'est pour un site Web interactif, qui a une application web exécutant un petit jeu, l'image est juste un exemple extrême! –
@Andreww Quelqu'un at-il résolu votre problème? Si oui, pourriez-vous s'il vous plaît accepter la meilleure réponse (cliquez sur la coche sous les points). Cela aidera les autres utilisateurs qui rencontrent votre question rapidement repérer la réponse acceptée et il donne également 15 rep. points à l'auteur (: – Danziger