出处:掘金
原作者:阿怼丶
pointer-events 是什么?
在日常的前端开发中,我们经常会遇到这样的场景:
- 弹窗遮罩层挡住了下层元素,导致无法点击;
- 自定义按钮的图标无法触发点击事件;
- 想让某个元素不可被鼠标点击,但又不能完全隐藏
- ……
pointer-events
是一个 CSS 属性,用于控制元素是否对鼠标事件(如点击、hover)做出响应。它最初是为 SVG 元素设计的,但现在已经可以用于 HTML 元素,并被广泛使用
常见取值与含义
pointer-events: auto | none;
pointer-events: auto
默认值,元素会响应鼠标事件,例如 click、hover、mousedown、mouseup 等
pointer-events: none
表示该元素不会响应任何鼠标事件,事件会“穿透”该元素传递到其下方的元素
典型应用场景
实现点击穿透
有时候我们会用一个透明的遮罩层来做一些 UI 效果,但又不希望它阻止用户点击下面的按钮:
.mask {
position: absolute;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
pointer-events: none;
}
这样设置后,遮罩层不会阻止用户与下层元素交互
只允许子元素接收点击事件
<div class="outer">
<button class="inner">点击我</button>
</div>
.outer {
pointer-events: none;
}
.inner {
pointer-events: auto;
}
这样可以让 .outer
不响应点击事件,但 .inner
仍然可以点击,非常适合用于图层控制。
防止元素被点击(例如禁用按钮)
有时候我们想通过样式实现“不可点击”效果:
.button-disabled {
pointer-events: none;
opacity: 0.5;
cursor: not-allowed;
}
注意:这只是视觉和交互上的禁用,不影响页面结构或可访问性,实际功能控制还需搭配 JavaScript
和 JavaScript 搭配使用
你还可以动态控制元素是否可以被点击:
element.style.pointerEvents = 'none';
// 3 秒后恢复
setTimeout(() => {
element.style.pointerEvents = 'auto';
}, 3000);
适合用于节流、防止连点、过渡动画控制等场景
注意事项
pointer-events
不影响元素的显示与布局,只控制“是否响应指针事件”;- 配合透明元素、悬浮层、组件库等使用效果极佳;
- 避免滥用,注意可访问性和用户体验,确保重要元素不会误设为
none
。