z-index不生效主因是元素未进入层叠上下文;只对定位元素有效,且需在同层叠上下文中比较,父容器未创建新上下文或元素为position:static时均无效。
直接给元素加 z-index 却没效果,大概率不是写错了值,而是它根本没进入「层叠上下文」。CSS 的 z-index 只对定位元素(position 为 relative、absolute、fixed 或 sticky)有效,且只在同一个层叠上下文中起作用。
transform、opacity、filter 等触发属性),子元素的 z-index 就只能跟兄弟元素比,无法跨父级压制其他区域position: static(默认值)的元素无视 z-index,哪怕写了也等于没写z-index 也可能“看起来没重叠”,但不可控想让 z-index 按预期工作,必须确保目标元素及其父容器处于你可控的层叠层级里。最稳妥的方式是主动创建层叠上下文,而不是依赖默认行为。
position: relative + z-index: 0(或任意非 auto 值),这是最轻量、兼容性最好的方式opacity: 0.99 或 transform: translateZ(0) 触发,它们虽能建上下文,但可能带来意外的渲染副作用(如模糊、滚动失效)z-index 基准(如 z-index: 1000),再按功能分层(1010 用于遮罩,1020 用于弹窗内容)别盲目堆砌 9999、999999 —— 这不仅难维护,还可能被第三方 UI 库(如 Ant Design、Element Plus)的默认值覆盖。关键是建立可推演的层级体系。
z-index: 100
z-index: 200
z-index: 300
z-index: 400
遇到重叠,不要立刻改 z-index,先确认渲染树结构是否符合预期。
立即学习“前端免费学习笔记(深入)”;
Computed 标签页,确认 z-index 是否计算为实际数值(不是 auto)position、transform、opacity 等属性,找到第一个非 auto 的 z-index 或触发层叠上下文的样式outline: 1px solid red,可视化它的边界和层叠范围z-index,子元素内部再大也没用position 却指望 z-index 生效的 div,以及被 opacity: 0.999 暗中劫持了层叠上下文的父容器。