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.