pointer-events属性助你点透蒙层

这个属性特别奇妙,以前从没想过它还能拥有这般超能力,让人眼前一亮。
通常我的使用场景是:把这个属性用在外层元素上,这样可以屏蔽鼠标事件,防止在表单提交的时候用户重复点击提交。
然而,现在我遇到一个很令人头疼的场景:按钮被某个<div>元素遮挡住了,而且这个<div>元素和按钮没有任何的父子元素,它们不在同一个DOM事件流中,这就导致无法使用冒泡和捕获的思想来解决。我能想到的比较规矩的解决办法是:根据点击事件的位置,判断是否点中了“按钮”,然后手动调用按钮的点击事件处理函数。虽说这种方案很中规中矩,但感觉不够简洁。多谢我的同事,她帮我想到了一个方法:使用pointer-events
一开始我无法理解pointer-events是怎么生效的,直到读到了一句话:

This CSS property, when set to "none" allows elements to not receive hover/click events, instead the event will occur on anything behind it.

恍然大悟。
设置了pointer-events:none的元素,其不会响应任何hover/click事件,而是由其后面的元素进行响应。当前元素和后面的元素,并没有父子关系啥的,就是层级上的先后关系。
下面给出一个demo的示例代码:
HTML

<button id="btn" onclick="alert('you click me!');">submit</button>
<div class="mask"></div>

CSS

.mask {
  position: absolute;
  top: 0;
  left: 0;
  width: 200px;
  height: 200px;
  background-color: rgba(0, 0, 0, 0.5);
  pointer-events: none;  
}
button {
  margin: 40px;
  width: 80px;
  height: 30px;
  line-height: 30px;
  font-size: 18px;
  text-align: center;
  text-transform: uppercase;
  box-shadow: 2px 2px 5px #888;
}

在上面这个例子中,因为<div class="mask">元素使用了pointer-events属性,所以按钮可以被点击到,弹出alert提示窗。如果去掉这句CSS属性,按钮则无法被点击到。线上demo可以戳这里:https://jsfiddle.net/gaoshu883/waer47kj/

参考资料:
https://www.hangge.com/blog/cache/detail_1859.html
https://caniuse.com/#search=pointer-events

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,367评论 0 2
  • pointer-events 可选的属性值 auto none visiblepainted visiblefil...
    FoolishFlyFox阅读 16,714评论 0 10
  • Mobile Web Favorites 参与贡献 移动前端开发收藏夹,欢迎使用Issues以及 Pull Req...
    柴东啊阅读 770评论 0 2
  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,538评论 1 11
  • 在前几天接到一个需求是要给后台管理系统加上文字水印的功能,使用了一个water-mark-oc的第三方插件的实现,...
    神秘者007阅读 1,683评论 0 4