通过绝对定位元素传递鼠标事件

IT技术 javascript html dom events dom-events
2021-02-10 17:23:01

我试图在一个元素上捕获鼠标事件,并在它上面有另一个绝对定位的元素。

现在,绝对定位元素上的事件击中它并冒泡到其父级,但我希望它对这些鼠标事件“透明”并将它们转发到它后面的任何事件。我应该如何实施?

6个回答
pointer-events: none;

是一个 CSS 属性,它使事件“通过”应用该属性的 HTML 元素。它使事件发生在“下面”的元素上。

详情请参阅:https : //developer.mozilla.org/en-US/docs/Web/CSS/pointer-events

几乎所有浏览器都支持,包括IE11;05/'21 的全球支持率约为 98.2%):http : //caniuse.com/#feat=pointer-events(感谢@s4y 在评论中提供链接)。

我刚刚将接受的答案换成了这个。对 的支持pointer-events 仍然不是超级棒,但它正在变得更好。要获得更兼容的选项,请使用@JedSchmidt 的答案。
2021-03-21 17:23:01
但是,如果您只想让滚动事件之类的事件通过但顶部元素仍然响应所有其他事件,该怎么办。将指针事件设置为 none 会杀死顶部元素上的所有事件。
2021-03-22 17:23:01
哇,这只是节省了我几个小时。
2021-04-02 17:23:01
谢谢!这是现代(和非 IE)浏览器的完美解决方案。在发布此问题时,我认为不pointer-events存在!我可能会在某个时候将接受的答案切换到这个答案。
2021-04-07 17:23:01
谢谢,我从来不知道这真的存在。它节省了我几个小时
2021-04-09 17:23:01

如果您只需要鼠标按下,您可以通过以下document.elementFromPoint方式使用该方法:

  1. 删除mousedown上的顶层,
  2. 事件中xy坐标传递document.elementFromPoint方法以获取下面的元素,然后
  3. 恢复顶层。
太棒了,我不知道这种方法存在!它也可以很容易地使用while循环获取光标下的所有元素,以获取最顶层的元素,然后隐藏它以找到下一个元素。在这里获取我的版本:gist.github.com/Pichan/5498404
2021-03-15 17:23:01
2021-03-22 17:23:01
此解决方法的问题在于它不适用于缩放页面。对于移动设备或桌面浏览器,放大 XY 坐标不再意味着什么,并且没有明确的方法来计算缩放。我相信捏缩放实际上是不可能的。
2021-03-28 17:23:01

也很高兴知道......
可以为父元素(可能是透明 div)禁用指针事件,但可以为子元素启用。如果您使用多个重叠的 div 层,您希望能够在其中单击任何层的子元素,这将很有帮助。为此,所有育儿 divpointer-events: none和 click-children 重新启用指针事件pointer-events: all

.parent {
    pointer-events:none;        
}
.child {
    pointer-events:all;
}

<div class="some-container">
   <ul class="layer-0 parent">
     <li class="click-me child"></li>
     <li class="click-me child"></li>
   </ul>

   <ul class="layer-1 parent">
     <li class="click-me-also child"></li>
     <li class="click-me-also child"></li>
   </ul>
</div>
它应该是“指针事件:自动;”。“all”值仅适用于 SVG。请参阅developer.mozilla.org/en-US/docs/Web/CSS/pointer-events
2021-03-16 17:23:01
太棒了,在发现的高潮pointer-events:none和即将影响孩子节点的失望之后,您节省了一天:)
2021-03-25 17:23:01
能否简单归结为:.parent * { pointer-events:all; }为了孩子?
2021-03-27 17:23:01
;) 对此非常高兴
2021-04-05 17:23:01

您没有收到事件的原因是绝对定位的元素不是您要“单击”的元素(蓝色 div)的子元素。我能想到的最简洁的方法是将绝对元素作为您想要点击的元素的子元素,但我假设您不能这样做,否则您不会在这里发布这个问题:)

另一种选择是为绝对元素注册一个点击事件处理程序,并为蓝色 div 调用点击处理程序,使它们都闪烁。

由于事件通过 DOM 冒泡的方式,我不确定是否有更简单的答案,但我很好奇是否有人有任何我不知道的技巧!

感谢您的回复,Loktar。不幸的是,在真实页面上,我不会知道绝对定位元素下面是什么,并且可能存在多个可能的目标。我能想到的唯一解决方法是抓取鼠标坐标并将它们与可能的目标进行比较以查看它们是否相交。那简直太恶心了。
2021-03-29 17:23:01

有一个 javascript 版本可以手动将事件从一个 div 重定向到另一个。

我把它清理干净,做成了一个 jQuery 插件。

这是 Github 存储库:https : //github.com/BaronVonSmeaton/jquery.forwardevents

不幸的是,我使用它的目的 - 在谷歌地图上覆盖一个蒙版并没有捕获点击和拖动事件,并且鼠标光标不会改变这会降低用户体验,以至于我决定在 IE 和 Opera 下隐藏蒙版 -不支持指针事件的两个浏览器。