"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 (over
chaqirilgan 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/out
ishlov beruvchilarini o’rnating. Bu yerdaonmouseenter/leave
dan ham foydalanish mumkin, lekin ular kamroq universal, agar delegatsiyani joriy qilsak ishlamaydi. - Sichqoncha kursori elementga kirganda,
mousemove
da tezlikni o’lchashni boshlang. - Agar tezlik sekin bo’lsa,
over
ni ishga tushiring. - Elementdan chiqayotganda va
over
bajarilgan bo’lsa,out
ni 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.