我正在尝试在一个元素上捕获鼠标事件,而该元素上方又有另一个绝对定位的元素。
目前,绝对定位元素上的事件会被它拦截并冒泡到其父级,但我希望它对这些鼠标事件是“透明”的,并将它们转发给它后面的任何元素。 我应该如何实现这一点?
我正在尝试在一个元素上捕获鼠标事件,而该元素上方又有另一个绝对定位的元素。
目前,绝对定位元素上的事件会被它拦截并冒泡到其父级,但我希望它对这些鼠标事件是“透明”的,并将它们转发给它后面的任何元素。 我应该如何实现这一点?
pointer-events: none;
CSS属性pointer-events可以使事件“穿过”应用该属性的HTML元素,从而在其下方的元素上触发事件。
详情请参见:https://developer.mozilla.org/zh-CN/docs/Web/CSS/pointer-events
该属性被几乎所有浏览器支持,包括 IE11;截至 2021 年 05 月,全球支持率约为 98.2%。可前往 http://caniuse.com/#feat=pointer-events 查看具体支持情况(感谢@s4y在评论中提供了链接)。
还有一个需要了解的是...
指针事件可以在父元素(可能是透明的div)中禁用,但仍可启用子元素。
如果您使用多个重叠的div层进行工作,并希望能够单击任何层的子元素,则此功能非常有用。为此,所有父级div都获取 pointer-events: none
,并且点击子元素通过 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>
pointer-events:none
的妙用,却很快失望地发现它会影响子节点,但是你救了我们一命 :) - Juan Cortés.parent * { pointer-events:all; }
以适用于子元素? - Dmitry.parent { pointer-events:none; }
和 .parent * { pointer-events:auto; }
。 - David如果你只需要鼠标按下事件,你可能可以使用document.elementFromPoint
方法,方法如下:
x
和y
坐标传递到document.elementFromPoint
方法中,以获取下面的元素,然后有一个JavaScript版本可用,它可以手动将事件从一个div重定向到另一个div。
我清理了它,并将其制作成了jQuery插件。
这是Github存储库: https://github.com/BaronVonSmeaton/jquery.forwardevents
不幸的是,我使用它的目的-在Google Maps上覆盖掩码没有捕获点击和拖动事件,并且鼠标光标不会改变,这会降低用户体验,因此我决定在IE和Opera下隐藏掩码-这两个浏览器不支持指针事件。
pointer-events
存在!将来可能会把采纳答案改成这个。 - s4ypointer-events
的支持仍然不是非常好(http://caniuse.com/#feat=pointer-events),但它正在变得更好。对于更兼容的选项,请选择@JedSchmidt的答案。 - s4y