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

s4y*_*s4y 291 html javascript events dom javascript-events

我试图在一个元素上捕获鼠标事件,并在其上面放置另一个绝对定位的元素.

现在,绝对定位元素上的事件击中它并冒泡到它的父级,但我希望它对这些鼠标事件"透明"并将它们转发给它背后的任何东西.我该如何实现呢?

Jan*_*anD 459

pointer-events: none;
Run Code Online (Sandbox Code Playgroud)

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

有关详细信息,请参阅:https://developer.mozilla.org/en/css/pointer-events

IE 11不支持它; 所有其他供应商都支持它很长一段时间(全球支持在12年/ 16年约为92%):http://caniuse.com/#feat=pointer-events(感谢@ s4y在评论中提供链接) .

  • 哇,这只是节省了我几个小时. (16认同)
  • 但是,如果您只想让诸如滚动事件之类的事件通过但顶部元素仍然响应所有其他事件,该怎么办。将 pointer-events 设置为 none 会杀死顶部元素上的所有事件。 (4认同)
  • 谢谢!这是现代(和非IE)浏览器的完美解决方案.在发布这个问题的时候,我不认为`指针事件'存在!我可以在某个时候将接受的答案改为此答案. (3认同)
  • 除了我需要透明元素及其下面的元素都发生此事件。 (3认同)
  • 我只是将接受的答案切换到了这个答案。对`pointer-events`的支持[仍然不是太棒了](http://caniuse.com/#feat=pointer-events),但是它变得越来越好。有关更兼容的选项,请使用@JedSchmidt的答案。 (2认同)
  • 谢谢,我从来不知道这真的存在。它节省了我几个小时 (2认同)
  • 触摸事件有等效的吗?触摸事件:无;或类似的? (2认同)

Jed*_*idt 48

如果您需要的只是mousedown,您可以通过以下document.elementFromPoint方式使用该方法:

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

  • 这里有更多罗嗦的解释:http://www.vinylfox.com/forwarding-mouse-events-through-layers/ (9认同)
  • 真棒,我不知道那种方法甚至存在!它也可以很容易地使用_while_循环来获取光标下的所有元素以获取最顶层的元素,然后隐藏它以便找到下一个元素.抓住我的版本:https://gist.github.com/Pichan/5498404 (2认同)
  • 此解决方法的问题是它不适用于缩放页面.对于移动设备或桌面浏览器,放大XY坐标不再具有任何意义,并且没有明确的方法来计算缩放.我相信捏缩放它实际上是不可能的. (2认同)

All*_*one 37

也很高兴知道...
可以为父元素(可能是透明div)禁用指针事件,并为子元素启用.如果您使用多个重叠的div图层,您希望能够单击任何图层的子元素,这将非常有用.为此,所有父母divs get pointer-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>
Run Code Online (Sandbox Code Playgroud)

  • 真棒,就在发现`指针 - 事件:无'以及让子节点受到影响的即将失效之后,你节省了一天:) (5认同)
  • 它应该是“指针事件:自动;”。“all”值仅适用于 SVG。请参阅 https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events (4认同)
  • 它可以归结为:`.parent * {pointer-events:all; }` 给孩子们? (2认同)
  • @Dmitry可以确认,这确实有效:`.parent {pointer-events:none; }` 和 `.parent * { 指针事件:自动;}` (2认同)

Lok*_*tar 7

您没有收到事件的原因是因为绝对定位的元素不是您想要"点击"(蓝色div)的元素的子元素.我能想到的最干净的方法是将绝对元素作为你想要点击的那个的孩子,但我假设你不能这样做,或者你不会在这里发布这个问题:)

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

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