La réponse de @Tim Down n'est pas performante si vous effectuez un rendu de 2.000 x 2.000. <a>
éléments :
OK, je viens de penser à un moyen. Superposez votre page avec un div qui qui couvre l'ensemble du document. À l'intérieur, créez (disons) 2 000 x 2 000 éléments (pour que la pseudo-classe :hover fonctionne dans IE 6, voir), d'une taille de 1 pixel chacun. Créez une règle CSS :hover pour ces éléments qui modifie une propriété (disons font-family). Dans votre gestionnaire de chargement, passez en revue chacun des 4 millions d'éléments, en vérifiant que currentStyle / getComputedStyle() jusqu'à ce que vous trouviez celui qui possède la police de survol. Extrapolez à partir de cet élément pour obtenir les coordonnées dans le document.
N.B. NE FAITES PAS ÇA.
Mais il n'est pas nécessaire de rendre 4 millions d'éléments en une seule fois, utilisez plutôt la recherche binaire. Il suffit d'utiliser 4 <a>
à la place :
- Étape 1 : Considérez l'ensemble de l'écran comme la zone de recherche de départ.
- Étape 2 : diviser la zone de recherche en 2 x 2 = 4 rectangles.
<a>
éléments
- Étape 3 : Utilisation du
getComputedStyle()
fonction déterminant dans quel rectangle la souris se trouve
- Étape 4 : réduisez la zone de recherche à ce rectangle et répétez l'étape 2.
De cette façon, vous devrez répéter ces étapes au maximum 11 fois, sachant que votre écran n'est pas plus large que 2048px.
Vous générerez donc un maximum de 11 x 4 = 44. <a>
éléments.
Si vous n'avez pas besoin de déterminer la position de la souris au pixel près, une précision de 10px est acceptable. Vous répéteriez les étapes au maximum 8 fois, donc vous auriez besoin de dessiner au maximum 8 x 4 = 32. <a>
éléments.
En outre, la génération puis la destruction de la <a>
n'est pas performant car DOM est généralement lent. Au lieu de cela, vous pouvez simplement réutiliser les 4 éléments initiaux de la base de données. <a>
et ajuster simplement leurs top
, left
, width
y height
pendant que vous passez en boucle les étapes.
Maintenant, en créant 4 <a>
est aussi une surenchère. Au lieu de cela, vous pouvez réutiliser le même <a>
lors des tests de getComputedStyle()
dans chaque rectangle. Ainsi, au lieu de diviser la zone de recherche en 2 x 2 <a>
réutilisent simplement un seul <a>
en le déplaçant avec top
y left
les propriétés de style.
Donc, tout ce dont vous avez besoin est un simple <a>
modifie son width
y height
max 11 fois, et modifier son top
y left
max 44 fois et vous aurez la position exacte de la souris.
66 votes
Rien d'anormal avec l'événement de déplacement de la souris. Seulement, dans certains cas, les utilisateurs ne déplacent pas la souris. Merci pour votre réponse.
2 votes
Norbert Tamas, la réponse de @SuperNova (qui n'a été ajoutée que cette année) montre que le mouseenter fonctionne bien dans ce cas, car il se déclenche au chargement de la page (si la souris est dans la fenêtre d'affichage). Cela ne fonctionnait pas de cette façon en 2010, ou est-ce simplement que personne n'a pensé à l'essayer ?
1 votes
@CrescentFresh Dans certains cas (comme les userscripts), vous ne voulez pas ralentir le navigateur en ajoutant de nombreux
mousemove
événements.0 votes
Possible dans FF avec le mouseover, mais pas dans IE et Chrome.
0 votes
Ou, dans un jeu, votre caméra se déplace dans l'univers du jeu et le personnage regarde la souris (style typique des jeux de tir de haut en bas) mais si l'utilisateur ne bouge pas la souris, il se centre autour du mauvais point lorsque vous vous déplacez si vous ne comptez que sur le déplacement de la souris. Cependant, ce n'est pas un problème, nous stockons simplement les coordonnées "mondiales" du pointeur et laissons les gens les interroger.
0 votes
Pour améliorer les performances de cette solution * Créez un élément avec une hauteur de 1px et une largeur de 100% et ajoutez la pseudo-classe :hover * Effectuez un balayage à partir du haut du document, un pixel à la fois, pour trouver la position Y * Après avoir obtenu la coordonnée Y, effectuez le même balayage sur l'axe X (cette fois, l'élément peut être seulement de 1px x 1px).
0 votes
@Pawel Êtes-vous en train de dire que, lorsque vous déplacez l'élément, dès qu'il se trouve sous la souris, il peut déclencher un événement ? Dans la jsfiddle suivante, laissez la souris sous la barre noire et attendez que la barre noire passe en dessous sans bouger, et voyez que les événements mouseover et mouseenter ne se déclenchent pas. jsfiddle.net/bowp569a .
0 votes
@Pawel Voici le même effort en utilisant la fonction
:hover
pseudo-sélecteur, mais il ne fonctionne pas sans déplacement réel de la souris : jsfiddle.net/z9w20f53