âChytrýâ tooltip
NapiÅ¡te funkci, která zobrazà tooltip nad elementem, jen když návÅ¡tÄvnÃk pÅesune ukazatel myÅ¡i na nÄj, ale ne pÅes nÄj.
Jinými slovy, jestliže návÅ¡tÄvnÃk pÅesune ukazatel nad element a zastavà se tam, tooltip se zobrazÃ. Ale pokud jen pÅesune myÅ¡ pÅes element jinam, pak to nenà tÅeba â kdo by chtÄl dalšà blikánÃ?
Technicky můžeme zmÄÅit rychlost ukazatele nad elementem, a pokud je nÃzká, pak pÅedpokládáme, že ukazatel vstoupil âna elementâ a zobrazÃme tooltip. Pokud je vysoká, budeme ukazatel ignorovat.
VytvoÅte k tomu univerzálnà objekt new SetrvánÃ(možnosti).
Jeho možnosti:
elemâ sledovaný element.overâ funkce, která bude volána, když ukazatel vstoupà na element, tedy když se nad nÃm pohybuje pomalu nebo se na nÄm zastavil.outâ funkce, která bude volána, když ukazatel opustà element (pokud byla pÅedtÃm volánaover).
PÅÃklad použità takového objektu s tooltipem:
// pÅÃklad tooltipu
let tooltip = document.createElement('div');
tooltip.className = "tooltip";
tooltip.innerHTML = "Tooltip";
// objekt bude sledovat myš a volat over/out
new SetrvánÃ({
elem,
over() {
tooltip.style.left = elem.getBoundingClientRect().left + 'px';
tooltip.style.top = elem.getBoundingClientRect().bottom + 5 + 'px';
document.body.append(tooltip);
},
out() {
tooltip.remove();
}
});
Demo:
Jestliže pohybujete myšà nad âhodinamiâ rychle, nic se nedÄje. Pokud jà pohybujete pomalu nebo se nad nimi zastavÃte, zobrazà se tooltip.
ProsÃme vÅ¡imnÄte si, že tooltip âneblikneâ, když se kurzor pÅesune mezi podelementy hodin.
Algoritmus vypadá jednoduše:
- UmÃstÃme na element handlery
onmouseover/out. Můžeme zde použÃt ionmouseenter/leave, ale ty jsou ménÄ univerzálnà a kdybychom zavedli delegovánÃ, nefungovaly by. - Když na element vstoupà ukazatel myÅ¡i, zaÄneme mÄÅit rychlost v
mousemove. - Pokud je rychlost nÃzká, spustÃme
over. - Když opustÃme element a bylo spuÅ¡tÄno
over, spustÃmeout.
Jak ale mÄÅit rychlost?
PrvnÃm nápadem může být spustit každých 100 ms funkci, která zmÄÅà vzdálenost mezi pÅedchozÃmi a souÄasnými souÅadnicemi. Bude-li malá, bude rychlost nÃzká.
NaneÅ¡tÄstà v JavaScriptu nenà žádný způsob, jak zjistit âaktuálnà souÅadnice myÅ¡iâ. Neexistuje žádná funkce jako getCurrentMouseCoordinates().
Jediný způsob, jak zjistit souÅadnice, je naslouchat událostem myÅ¡i, napÅ. mousemove, a zjišťovat souÅadnice z objektu události.
VytvoÅÃme tedy handler pro mousemove, aby sledoval souÅadnice a pamatoval si je. A pak je jednou za 100 ms budeme porovnávat.
P.S. ProsÃme vÅ¡imnÄte si, že testy v ÅeÅ¡enà použÃvajà dispatchEvent, aby vidÄly, zda tooltip funguje správnÄ.