可以通过以下技术确定鼠标光标下的元素(即最上面的悬停元素):
- 监听
mousemove
事件,目标是:event.target
或者document.elementFromPoint(event.clientX, event.clientY)
。
当滚动页面时且不移动鼠标时,此方法不起作用。此时,鼠标在技术上没有移动;因此,不会触发任何鼠标事件。
不幸的是,在监听 scroll
事件时,以上两种技术都不再适用。 event.target
将是被滚动的任何元素(或者是 document
)。此外,鼠标光标位置未公开在 event
对象上。
如“Determine which element the mouse pointer is on top of in Javascript” 中所述,一种可能的解决方案是通过 CSS 的 :hover
伪类查询悬停的元素。
document.addEventListener('scroll', () => {
const hoverTarget = document.querySelector('.element:hover');
if (hoverTarget) {
hover(hoverTarget);
}
});
然而,这种方法并不可行,因为它非常低效和不准确。 scroll
事件是其中一个频繁触发的事件,当执行任何稍微耗费一点资源的操作(例如查询 DOM)时,需要放慢速度。
另外,在滚动时,鼠标停留的元素会滞后。您可以在任何具有大量链接的网站上观察到这一点:将鼠标悬停在其上,然后滚动到另一个链接上而不移动鼠标。只有几毫秒后它才会更新。
是否有任何方法可以实现这种方式,既能高效又能实现良好的效果?基本上,我想要与 mouseenter
相反的功能:不是知道鼠标何时进入元素,而是知道元素何时与鼠标相交(例如在滚动时)。
hover
类。但是,您是否也希望在mousemove
时应用此hover
类呢? - Freeman Lambda