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


307

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

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

Answers:


489
pointer-events: none;

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

详情请参阅:https : //developer.mozilla.org/en/css/pointer-events

IE 11之前不支持该功能。一段时间以来,所有其他供应商都支持它(在16年12月16日,全球支持约为92%):http : //caniuse.com/#feat=pointer-events(感谢@ s4y在评论中提供了链接) 。


3
谢谢!对于现代(和非IE)浏览器来说,这是一个完美的解决方案。在发布此问题时,我认为不pointer-events存在!我可能会在某个时候将接受的答案切换到这一答案。
s4y 2011年

16
哇,这只是节省了我几个小时。
Dan Abramov

2
我只是将接受的答案切换到了这个答案。对的支持pointer-events 仍然不是很出色,但是正在变得越来越好。有关更兼容的选项,请使用@JedSchmidt的答案。
s4y 2012年

1
谢谢,我从来不知道这实际上存在。它节省了我几个小时
Mohammed A. Al Jama

2
但是,如果您只想让诸如滚动事件之类的事件通过,而让top元素仍然响应所有其他事件,该怎么办?将指针事件设置为none会杀死顶部元素上的所有事件。
AndroidDev '17

50

如果您只需要按下鼠标,便可以通过以下document.elementFromPoint方法来实现该方法:

  1. 移除mousedown的顶层,
  2. 将事件的xy坐标传递给document.elementFromPoint方法,以获取下方的元素,然后
  3. 恢复顶层。

9
更多详细说明,请访问:Vinylfox.com/forwarding-mouse-events-through-layers
Nathan

2
太棒了,我什至不知道该方法存在!也可以很容易地使用它使用while循环获取光标下方的所有元素,以获取最顶层的元素,然后将其隐藏以查找下一个元素。在此处获取
jpeltoniemi 2013年

2
此解决方法的问题是它不适用于缩放页面。对于移动设备或桌面浏览器,放大XY坐标不再意味着任何事情,并且没有清晰的方法来计算缩放。我相信进行捏变焦实际上是不可能的。
Impossibear 2014年

39

也很高兴知道...
可以为父元素(可能是透明的div)禁用指针事件,但为子元素启用指针事件。如果您要处理多个重叠的div层(希望在其中单击任何层的子元素),这将很有帮助。为此,所有育儿div get pointer-events: none和click-children get指针事件均由重新启用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>

5
太棒了,在发现高位pointer-events:none节点以及影响子节点的迫在眉睫之后,您可以节省一天的时间:)
JuanCortés2015年

;)
对此

可以归结为:.parent * { pointer-events:all; }儿童吗?
德米特里(Dmitry)'18

它应该是“ pointer-events:auto;”。“ all”值仅适用于SVG。参见developer.mozilla.org/en-US/docs/Web/CSS/pointer-events
mattavatar

7

您未收到事件的原因是,绝对定位的元素不是您要“单击”的元素的子元素(蓝色div)。我能想到的最干净的方法是将绝对元素作为您想要单击的元素的子元素,但是我假设您不能这样做,或者您不会在这里发布此问题:)

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

由于事件通过DOM冒泡的方式,我不确定是否有一个简单的答案,但是我非常想知道其他人是否有我不知道的技巧!


感谢您的回复,Loktar。不幸的是,在实际页面上,我不会知道绝对定位元素的底下是什么,并且可能有多个目标。我能想到的唯一解决方法是获取鼠标坐标并将其与可能的目标进行比较,以查看它们是否相交。那简直就是令人讨厌。
2009年

4

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

我将其清理干净并制作为jQuery插件。

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

不幸的是,我使用它的目的是-在Google Maps上覆盖一个遮罩无法捕获单击和拖动事件,并且鼠标光标没有发生变化,这会降低用户体验,以至于我决定将其隐藏在IE和Opera下-这两个不支持指针事件的浏览器。


1

如果知道需要鼠标事件的元素,并且叠加层是透明的,则可以将它们的z索引设置为比叠加层更高的值。在这种情况下,所有事件当然都应该在所有浏览器上都起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.