Mise à jour (5/5/16) : Réponse des patrons devrait être utilisé à la place, car il est à la fois plus simple et plus fiable.
Étant donné que le canevas n'est pas toujours stylé par rapport à l'ensemble de la page, la fonction canvas.offsetLeft/Top
ne renvoie pas toujours ce dont vous avez besoin. Il renvoie le nombre de pixels qu'il est décalé par rapport à son élément offsetParent, ce qui peut être quelque chose comme un div
contenant le canevas avec un position: relative
appliqué. Pour tenir compte de cela, vous devez passer en boucle la chaîne de offsetParent
en commençant par l'élément de toile lui-même. Ce code fonctionne parfaitement pour moi, testé dans Firefox et Safari mais devrait fonctionner pour tous.
function relMouseCoords(event){
var totalOffsetX = 0;
var totalOffsetY = 0;
var canvasX = 0;
var canvasY = 0;
var currentElement = this;
do{
totalOffsetX += currentElement.offsetLeft - currentElement.scrollLeft;
totalOffsetY += currentElement.offsetTop - currentElement.scrollTop;
}
while(currentElement = currentElement.offsetParent)
canvasX = event.pageX - totalOffsetX;
canvasY = event.pageY - totalOffsetY;
return {x:canvasX, y:canvasY}
}
HTMLCanvasElement.prototype.relMouseCoords = relMouseCoords;
La dernière ligne rend les choses plus pratiques pour obtenir les coordonnées de la souris par rapport à un élément du canevas. Tout ce qui est nécessaire pour obtenir les coordonnées utiles est
coords = canvas.relMouseCoords(event);
canvasX = coords.x;
canvasY = coords.y;
1 votes
Cela ne devrait pas être différent de la réception des événements de souris des éléments normaux du domaine. quirksmode a une bonne référence à ce sujet.
4 votes
Le code que vous énumérez ci-dessus ne fonctionne que lorsque le canevas n'est pas profond à l'intérieur d'autres conteneurs. En général, vous devez utiliser quelque chose comme la fonction offset de jquery [var testDiv = $('#testDiv') ; var offset = testDiv.offset() ;] pour obtenir le décalage correct d'un navigateur à l'autre. C'est un vrai casse-tête.
0 votes
Le code affiché ci-dessus avec la mise à jour ne fonctionne pas si la page contenant la toile défile.
0 votes
J'ai supprimé mon ancienne "réponse" qui était incluse comme mise à jour de la question. Comme indiqué, elle était périmée et incomplète.
0 votes
Event.layerX et event.layerY sont maintenant dans Chrome, FF, et MSIE(9)
3 votes
Puisqu'il y a environ 50 réponses ici, je recommande de faire défiler jusqu'à la réponse de ce type : patriques - une bonne et simple réponse à 5 lignes.
0 votes
Cette question est devenue horriblement encombrée. Des liens plus à jour ici : stackoverflow.com/questions/29607924/