"Smart" tooltip
Scrivete una funzione che mostri un tooltip su un elemento solo se lâutente sposta il mouse su di esso, e non attraverso di esso.
In altre parole, se il visitatore sposta il mouse su questo elemento e si ferma lì â mostra il tooltip. Se invece ha solo spostato il mouse passandoci sopra, non ce nâè bisogno, dâaltronde chi mai vorrebbe altri elementi lampeggianti non desiderati?
Tecnicamente, possiamo misurare la velocità del mouse su un elemento, e se è abbastanza lento possiamo supporre che sta arrivando proprio âsullâelementoâ, mostrando il tooltip, se è troppo veloce â lo ignoriamo.
Creare un oggetto universale new HoverIntent(options) utile allo scopo.
Le opzioni possibili options:
elemâ elemento da tracciare.overâ una funzione da chiamare se il mouse arriva sullâelemento: ossia, se si muove lentamente o se si ferma sullâelemento.outâ una funzione da chiamare quando il mouse abbandona lâelemento (se è stato chiamatoover).
Ecco un esempio dellâuso di questo oggetto per il tooltip:
// un tooltip di esempio
let tooltip = document.createElement('div');
tooltip.className = "tooltip";
tooltip.innerHTML = "Tooltip";
// l'oggetto tiene traccia del mouse e chiama 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:
Muovendo il mouse oltre la velocità di âclockâ non succede nulla, facendolo lentamente o fermandocisi sopra, viene mostrato il tooltip.
Nota bene: il tooltip non âlampeggiaâ quando il cursore si muove tra i sottoelementi dellâorologio.
Lâalgoritmo è semplice:
- Impostare dei gestori
onmouseover/outsullâelemento. Qui si possono anche usareonmouseenter/leave, però sono meno universali, e non funzionerebbero se introducessimo lâuso della delegation. - Quando il puntatore è entrato dentro lâelemento, si comincia a misurare la velocità al
mousemove. - Se la velocità è lenta, eseguire
over. - Quando si esce fuori dallâelemento, ed è stato eseguito
over, eseguireout.
Ma come misurare la velocità ?
La prima strategia potrebbe essere: eseguire una funzione ogni 100ms e misurare la distanza tra le vecchie e nuove coordinate. Se fosse piccola, anche la velocità lo sarebbe.
Sfortunatamente, non câè modo di ricavare âle coordinate attuali del mouseâ in JavaScript. Non esistono funzioni come getCurrentMouseCoordinates().
Lâunico modo è di mettersi in ascolto sugli eventi del mouse, come mousemove, e prendere le coordinate dallâoggetto evento.
Quindi impostiamo un gestore su mousemove per tenere traccia delle coordinate e memorizzarle, per poi confrontarle ogni 100ms.
P.S.: Nota bene: i test della soluzione fanno uso di dispatchEvent per vedere se il tooltip funziona bene.