加了z-index仍点不了,是因为元素不在同一层叠上下文中;transform、opacity等属性会创建新层叠上下文,使z-index失效;应检查Computed面板中z-index是否为auto或“not applicable”,并逐级查找建立层叠上下文的祖先元素。
z-index 还是点不了不是 z-index 值不够大,而是它根本没在同一个层叠上下文里比。一个 transform: translateY(0)、opacity: 0.99、filter: blur(1px) 或 will-change: transform 就会让父元素悄悄创建新层叠上下文,把子元素的 z-index 锁死在局部范围。
检查方式:打开开发者工具 → “Computed” 面板 → 搜索 z-index,如果显示为 auto 或标着 “not applicable”,说明它已失效。
transform、opacity 等属性,看点击是否恢复z-index: 9999,而是把目标元素提到那个上下文之外(比如挂到 <body> 下)pointer-events: none 是什么情况下该用当你确认遮挡层纯属视觉装饰——比如半透明蒙版、背景光效、仅用于动画过渡的占位层——且不需要任何交互时,pointer-events: none 就是最轻量、最确定的解法。
它不改变布局、不触发重排、不影响动画或焦点逻辑,只精准切断鼠标/触控事件捕获。视觉照常显示,点击直接落到下层 <a> 或 <button> 上。
立即学习“前端免费学习笔记(深入)”;
pointer-events: none,不是给被遮挡的目标元素加pointer-events: auto
auto 和 none;visible、fill 等值会被忽略::before/::after 也在挡路哪怕只是画个阴影、渐变或边框,::before 和 ::after 默认参与事件流,会稳稳盖住下面的链接。别指望 z-index: -1 能解决——在已有层叠上下文的父容器里,它根本不起作用。
正确做法是直接控制事件流:
pointer-events: none,例如:.overlay::before { pointer-events: none; }
hover 效果但又不想拦截点击,得拆开:一个仅视觉的伪元素 + 一个透明但可点的空元素覆盖在上层opacity: 0 或 visibility: hidden——它们依然吃点击;只有 display: none 或 pointer-events: none 才真正释放事件流不是所有“点不了”都该加 pointer-events,先得确认谁在挡路。开发者工具里右键目标区域,“检查”跳到的 DOM 节点往往就是罪魁祸首。
outline: 2px solid red,看是否真覆盖链接热区pointer-events,看值是不是 none(哪怕带删除线,也说明被祖先设过)stacking context,找到第一个标有 “This element establishes a stacking context” 的祖先——它大概率就是让 z-index 失效的源头<div>、<section> 或设置了宽高但没内容的容器,它们常被忽略却稳稳盖着链接多个 pointer-events: none 层叠时,事件穿透顺序严格按渲染树绘制顺序,不是 DOM 顺序。真机测试尤其 iOS Safari 上,点被设为 none 的区域,务必确认下层链接真能响应 click,而不是只在桌面浏览器里看起来正常。