darsga qaytish

"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”.

Sinovlar bilan sandbox-ni oching.

Algoritm oddiy ko’rinadi:

  1. Elementga onmouseover/out ishlov beruvchilarini o’rnating. Bu yerda onmouseenter/leave dan ham foydalanish mumkin, lekin ular kamroq universal, agar delegatsiyani joriy qilsak ishlamaydi.
  2. Sichqoncha kursori elementga kirganda, mousemove da tezlikni o’lchashni boshlang.
  3. Agar tezlik sekin bo’lsa, over ni ishga tushiring.
  4. 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.

Yechimni sandbox-dagi sinovlar bilan oching.