"Aqlli" tooltip
Faqat tashrif buyuruvchi sichqonchani elementga olib kelganda koârsatiladigan, lekin orqali oâtkazganda koârsatilmaydigan tooltip funksiyasini yozing.
Boshqacha qilib aytganda, agar tashrif buyuruvchi sichqonchani elementga olib kelib, u yerda toâxtatsa â tooltipni koârsating. Va agar ular shunchaki sichqonchani orqali oâtkazgan boâlsa, kerak emas, kim qoâshimcha miltillashni xohlaydi?
Texnik jihatdan, biz element ustida sichqoncha tezligini oâlchashimiz mumkin va agar u sekin boâlsa, u âelement ustiga kelganâ deb hisoblaymiz va tooltipni koârsatamiz, agar tez boâlsa â uni eâtiborsiz qoldiramiz.
Buning uchun universal obyekt new HoverIntent(options) yarating.
Uning options lari:
elemâ kuzatish uchun element.overâ agar sichqoncha elementga kelgan boâlsa chaqiriladigan funksiya: yaâni u sekin harakat qiladi yoki uning ustida toâxtaydi.outâ sichqoncha elementni tark etganda chaqiriladigan funksiya (overchaqirilgan boâlsa).
Bunday obyektni tooltip uchun ishlatish misoli:
// tooltip namunasi
let tooltip = document.createElement('div');
tooltip.className = "tooltip";
tooltip.innerHTML = "Tooltip";
// obyekt sichqonchani kuzatadi va over/out ni chaqiradi
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();
}
});
Demo:
Agar siz sichqonchani âsoatâ ustiga tez harakat qildirsangiz, hech narsa boâlmaydi, va agar uni sekin qilsangiz yoki ularda toâxtatsangiz, tooltip paydo boâladi.
Diqqat qiling: kursor soat kichik elementlari orasida harakat qilganda tooltip âmiltillamaydiâ.
Algoritm oddiy koârinadi:
- Elementga
onmouseover/outishlov beruvchilarini oârnating. Bu yerdaonmouseenter/leavedan ham foydalanish mumkin, lekin ular kamroq universal, agar delegatsiyani joriy qilsak ishlamaydi. - Sichqoncha kursori elementga kirganda,
mousemoveda tezlikni oâlchashni boshlang. - Agar tezlik sekin boâlsa,
overni ishga tushiring. - Elementdan chiqayotganda va
overbajarilgan boâlsa,outni ishga tushiring.
Lekin tezlikni qanday oâlchash kerak?
Birinchi gâoya quyidagicha boâlishi mumkin: har 100ms da funksiyani ishga tushirish va oldingi va yangi koordinatalar orasidagi masofani oâlchash. Agar u kichik boâlsa, tezlik kichik.
Afsuski, JavaScript da âjoriy sichqoncha koordinatalariniâ olishning imkoni yoâq. getCurrentMouseCoordinates() kabi funksiya yoâq.
Koordinatalarni olishning yagona yoâli â mousemove kabi sichqoncha hodisalarini tinglash va koordinatalarni hodisa obyektidan olish.
Shuning uchun koordinatalarni kuzatish va eslab qolish uchun mousemove ga ishlov beruvchi oârnatamiz. Keyin ularni har 100ms da bir marta solishtiramiz.
P.S. Diqqat qiling: yechim testlari tooltip toâgâri ishlayotganini koârish uchun dispatchEvent dan foydalanadi.