Derse geri dön

"Akıllı" tooltip

önem: 5

Kullanıcı fareyle bir elementin üzerinden geçtiğinde ancak üzerinden geçip gitmediğinde tooltip (ipucu) gösteren bir fonksiyon yazın.

Diğer kelimelerle, eğer kullanıcı faresiyle bir ögenin üzerine gelirse ve durursa – tooltipi göster. Ancak eğer faresiyle bu ögenin üzerinden hızlıca geçip giderse, tooltip gösterme.

Teknik olarak, bir öğenin üzerindeki fare hızını ölçebiliriz, eğer hızı yavaşsa biz bunu elementin üzerinden geçiyor kabul ederek tooltipi göstermeliyiz. Hızı fazla ise o zaman görmezden gelmeliyiz.

Bunun için global obje new HoverIntent(options) yap. options (seçenekler) ile beraber:

  • elem – Takip edilecek element.
  • over – Eğer fare elementin üzerinden yavaşca geçiyorsa çağırılacak fonksiyon.
  • out – Fare elementin üzerinden ayrıldığı zaman çağırılacak fonksiyon (eğer over çağırıldıysa).

Tooltip için böyle bir objeyi kullanmaya bir örnek:

// örnek tooltip
let tooltip = document.createElement('div');
tooltip.className = "tooltip";
tooltip.innerHTML = "Tooltip";

// mouse hareketlerini takip edecek nesne
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:

Fareyi “saat” üzerine hızlı bir şekilde hareket ettirirseniz hiçbir şey olmaz ve bunu yavaş yaparsanız veya durdurursanız, bir tooltip gösterecektir.

Lütfen dikkat: imleç saat alt öğeleri arasında hareket ettiğinde tooltip “gelip gitmez”.

Testler ile korunaklı olan aç.

The algorithm looks simple:

  1. Put onmouseover/out handlers on the element. Also can use onmouseenter/leave here, but they are less universal, won’t work if we introduce delegation.
  2. When a mouse cursor entered the element, start measuring the speed on mousemove.
  3. If the speed is slow, then run over.
  4. Later if we’re out of the element, and over was executed, run out.

The question is: “How to measure the speed?”

The first idea would be: to run our function every 100ms and measure the distance between previous and new coordinates. If it’s small, then the speed is small.

Unfortunately, there’s no way to get “current mouse coordinates” in JavaScript. There’s no function like getCurrentMouseCoordinates().

The only way to get coordinates is to listen to mouse events, like mousemove.

So we can set a handler on mousemove to track coordinates and remember them. Then we can compare them, once per 100ms.

P.S. Please note: the solution tests use dispatchEvent to see if the tooltip works right.

Çözümü testler korunaklı alanda olacak şekilde aç.