Info-bulle "Intelligente"
Ecrivez une fonction qui montre une info-bulle sur un élément seulement si le visiteur déplace la souris sur celui-ci, et non pas en le traversant.
En dâautres termes, si lâusager dĂ©place la souris sur lâĂ©lĂ©ment et sâarrĂȘte dessus â afficher lâinfo bulle. Et si le visiteur dĂ©place seulement la souris en traversant rapidement lâĂ©lĂ©ment, pas besoin de le faire, qui a besoin dâun clignotement supplĂ©mentaire ?
Techniquement, nous pouvons mesurer la vitesse de la souris sur un Ă©lĂ©ment, et si elle est lente alors nous pouvons assumer quâelle arrive âsur lâĂ©lĂ©mentâ et monter lâinfo-bulle, si elle est rapide â alors on lâignore.
Créer un objet universel new HoverIntent(options) pour cela.
Ses options :
elemâ lâĂ©lĂ©ment Ă surveiller.overâ une fonction Ă appeler si la souris arrive sur lâĂ©lĂ©ment : câest-Ă -dire quâelle se dĂ©place lentement ou sâarrĂȘte dessus.outâ une fonction Ă appeler quand la souris quitte lâĂ©lĂ©ment (sioverĂ©tait appelĂ©).
Un exemple dâusage dâun tel objet pour lâinfo-bulle:
// un example d'info-bulle
let tooltip = document.createElement('div');
tooltip.className = "tooltip";
tooltip.innerHTML = "Tooltip";
// Lâobjet va suivre la souris et appeler les fonctions over/out
new HoverIntent({
elem,
over() {
tooltip.style.left = elem.getBoundingClientRect().left + 'px';
tooltip.style.top = elem.getBoundingClientRect().bottom + 5 + 'px';
document.body.append(tooltip);
},
out() {
tooltip.remove();
}
});
La demo:
Si vous dĂ©placez la souris rapidement sur la âmontreâ alors rien ne se passe, et si vous le faites lentement ou que vous vous arrĂȘtez, alors il y aura une info-bulle.
Notez bien: lâinfo-bulle ne âclignoteâ pas lorsque le curseur se dĂ©place entre la montre et les sous Ă©lĂ©ments.
The algorithm looks simple:
- Put
onmouseover/outhandlers on the element. Also can useonmouseenter/leavehere, but they are less universal, wonât work if we introduce delegation. - When a mouse cursor entered the element, start measuring the speed on
mousemove. - If the speed is slow, then run
over. - When weâre going out of the element, and
overwas executed, runout.
But how to measure the speed?
The first idea can be: run a function every 100ms and measure the distance between previous and new coordinates. If itâs small, then the speed is small.
Unfortunately, thereâs no way to get âcurrent mouse coordinatesâ in JavaScript. Thereâs no function like getCurrentMouseCoordinates().
The only way to get coordinates is to listen for mouse events, like mousemove, and take coordinates from the event object.
So letâs set a handler on mousemove to track coordinates and remember them. And then compare them, once per 100ms.
P.S. Please note: the solution tests use dispatchEvent to see if the tooltip works right.