2017-05-09 2 views
1

je l'image PNG suivante avec transparence:HTML - Mettre en place un bouton avec une forme cliquable personnalisée à partir d'une image PNG avec transparence

Button image

Je voudrais faire un bouton dans HTML & CSS que les utilisations le canal alpha en tant que masque, de sorte qu'il ne fonctionne que si les utilisateurs cliquent dans la zone rose.

Est-ce possible? Comment peut-il être mis en œuvre?

+1

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é! –

+0

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! –

+0

@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

Répondre

0

Vous pouvez vérifier l'image-carte HTML map Tag

+0

Cela fonctionnera pour des cas d'utilisation simples et statiques, mais je ne pense pas que ce soit la bonne solution pour une forme/image arbitraire, surtout si cela peut changer à l'avenir. en compte le canal alpha de l'image et devra être défini manuellement – Danziger

0

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.

+1

Merci pour la réponse, les commentaires du code javascript sont très utiles! Je viens de l'arrière-plan de programmation aC# qui fait le passage à l'avant, Wonderful! –