"УмнаÑ" подÑказка
ÐапиÑиÑе ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¿Ð¾ÐºÐ°Ð·ÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð´ÑÐºÐ°Ð·ÐºÑ Ð½Ð°Ð´ ÑлеменÑом ÑолÑко в ÑлÑÑае, когда полÑзоваÑÐµÐ»Ñ Ð¿ÐµÑÐµÐ´Ð²Ð¸Ð³Ð°ÐµÑ Ð¼ÑÑÑ Ð½Ð° него, но не ÑеÑез него.
ÐÑÑгими Ñловами, еÑли полÑзоваÑÐµÐ»Ñ Ð¿Ð¾Ð´Ð²Ð¸Ð½Ñл кÑÑÑÐ¾Ñ Ð½Ð° ÑлеменÑе и оÑÑановилÑÑ â показÑваÑÑ Ð¿Ð¾Ð´ÑказкÑ. РеÑли он пÑоÑÑо бÑÑÑÑо пÑовÑл кÑÑÑоÑом по ÑлеменÑÑ, Ñо не надо ниÑего показÑваÑÑ. ÐÐ¾Ð¼Ñ Ð¿Ð¾Ð½ÑавиÑÑÑ Ð»Ð¸Ñнее мелÑкание?
Ð¢ÐµÑ Ð½Ð¸ÑеÑки, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ измеÑÑÑÑ ÑкоÑоÑÑÑ Ð¿ÑÐ¾Ñ Ð¾Ð´Ð° кÑÑÑоÑа мÑÑи над ÑлеменÑом, и еÑли она низкаÑ, Ñо можно поÑÑиÑаÑÑ, ÑÑо полÑзоваÑÐµÐ»Ñ Ð¾ÑÑановил кÑÑÑÐ¾Ñ Ð½Ð°Ð´ ÑлеменÑом, и показаÑÑ ÐµÐ¼Ñ Ð¿Ð¾Ð´ÑказкÑ. РеÑли ÑкоÑоÑÑÑ Ð²ÑÑокаÑ, Ñо Ñогда не показÑваÑÑ.
СоздайÑе Ð´Ð»Ñ ÑÑого ÑнивеÑÑалÑнÑй обÑÐµÐºÑ new HoverIntent(options).
Ðго наÑÑÑойки options:
elemâ оÑÑлеживаемÑй ÑлеменÑ.overâ ÑÑнкÑиÑ, вÑзÑваемаÑ, пÑи Ð·Ð°Ñ Ð¾Ð´Ðµ на ÑлеменÑ, ÑÑиÑаем ÑÑо Ð·Ð°Ñ Ð¾Ð´ â ÑÑо когда кÑÑÑÐ¾Ñ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾ двигаеÑÑÑ Ð¸Ð»Ð¸ оÑÑановилÑÑ Ð½Ð°Ð´ ÑлеменÑом.outâ ÑÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи ÑÑ Ð¾Ð´Ðµ кÑÑÑоÑа Ñ ÑлеменÑа (еÑли бÑл Ð·Ð°Ñ Ð¾Ð´).
ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñакого обÑекÑа Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° подÑказки:
// пÑÐ¸Ð¼ÐµÑ Ð¿Ð¾Ð´Ñказки
let tooltip = document.createElement('div');
tooltip.className = "tooltip";
tooltip.innerHTML = "Tooltip";
// обÑÐµÐºÑ Ð±ÑÐ´ÐµÑ Ð¾ÑÑлеживаÑÑ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ðµ мÑÑи и вÑзÑваÑÑ ÑÑнкÑии over/out
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();
}
});
Ðемо:
ÐÑли двигаÑÑ ÐºÑÑÑÐ¾Ñ Ð½Ð°Ð´ «ÑаÑами» бÑÑÑÑо, Ñо ниÑего не пÑоизойдÑÑ, а еÑли Ð²Ñ Ð·Ð°Ð¼ÐµÐ´Ð»Ð¸Ñе движение кÑÑÑоÑа над ÑлеменÑом или оÑÑановиÑе его, Ñо бÑÐ´ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð° подÑказка.
ÐбÑаÑиÑе внимание: подÑказка не должна пÑопадаÑÑ (мигаÑÑ), когда кÑÑÑÐ¾Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð´Ð¾ÑеÑними ÑлеменÑами ÑаÑов.
ÐÑкÑÑÑÑ Ð¿ÐµÑоÑниÑÑ Ñ ÑеÑÑами Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ñи.
ÐлгоÑиÑм вÑглÑÐ´Ð¸Ñ Ð¿ÑоÑÑо:
- ÐазнаÑаем обÑабоÑÑики
onmouseover/outна ÑлеменÑе. Также можно бÑло Ð±Ñ Ð¸ÑполÑзоваÑÑonmouseenter/leave, но они менее ÑнивеÑÑалÑÐ½Ñ Ð¸ не ÑÑабоÑаÑÑ Ñ Ð´ÐµÐ»ÐµÐ³Ð¸Ñованием. - Ðогда кÑÑÑÐ¾Ñ Ð¿ÐµÑеÑ
Ð¾Ð´Ð¸Ñ Ð½Ð° ÑлеменÑ, наÑинаем измеÑÑÑÑ ÑкоÑоÑÑÑ ÐµÐ³Ð¾ движениÑ, иÑполÑзÑÑ
mousemove. - ÐÑли ÑкоÑоÑÑÑ Ð½Ð¸Ð·ÐºÐ°Ñ, Ñо вÑзÑваем
over. - Ðогда Ð¼Ñ Ð²ÑÑ
одим из ÑлеменÑа, еÑли запÑÑкали
over, вÑзÑваемout.
Ðо как измеÑиÑÑ ÑкоÑоÑÑÑ?
ÐеÑÐ²Ð°Ñ Ð¸Ð´ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñакой: запÑÑкаÑÑ Ð½Ð°ÑÑ ÑÑнкÑÐ¸Ñ ÐºÐ°Ð¶Ð´Ñе 100ms и наÑ
одиÑÑ ÑазниÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð¿Ñежними и ÑекÑÑими кооÑдинаÑами кÑÑÑоÑа. ÐÑли она мала, Ñо знаÑÐ¸Ñ Ð¸ ÑкоÑоÑÑÑ Ð½Ð¸Ð·ÐºÐ°Ñ.
Ð ÑожалениÑ, в JavaScript Ð½ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи полÑÑаÑÑ ÑекÑÑие кооÑдинаÑÑ Ð¼ÑÑи. Ðе ÑÑÑеÑÑвÑÐµÑ ÑÑнкÑии Ñипа полÑÑиÑÑТекÑÑиеÐооÑдинаÑÑÐÑÑи().
ÐдинÑÑвеннÑй пÑÑÑ â ÑÑо ÑлÑÑаÑÑ ÑобÑÑÐ¸Ñ Ð¼ÑÑи, напÑÐ¸Ð¼ÐµÑ mousemove, и кооÑдинаÑÑ Ð±ÑаÑÑ Ð¸Ð· обÑекÑа ÑобÑÑиÑ.
Так ÑÑо поÑÑавим обÑабоÑÑик на mousemove, ÑÑÐ¾Ð±Ñ Ð¾ÑÑлеживаÑÑ ÐºÐ¾Ð¾ÑдинаÑÑ Ð¸ запоминаÑÑ Ð¸Ñ
. РбÑдем ÑÑавниваÑÑ ÑезÑлÑÑаÑÑ ÐºÐ°Ð¶Ð´Ñе 100ms.
P.S. ÐбÑаÑиÑе внимание: ÑеÑÑÑ Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ ÑÑой задаÑи иÑполÑзÑÑÑ dispatchEvent, ÑÑÐ¾Ð±Ñ Ð¿ÑовеÑиÑÑ, ÑÑо подÑказка ÑабоÑÐ°ÐµÑ ÐºÐ¾ÑÑекÑно.
ÐÑкÑÑÑÑ ÑеÑение Ñ ÑеÑÑами в пеÑоÑниÑе.