z-index失效的首要原因是父元素意外创建堆叠上下文,其次才是position未设或设错、Tailwind配置错误、原生元素渲染层更高。需逐级检查Computed面板中“Stacking context by…”标记,并验证opacity、transform等触发属性。
绝大多数“z-index设再大也没用”的情况,根源不在子元素本身,而在它的某个父级悄悄触发了新的堆叠上下文(Stacking Context)。一旦发生,子元素的z-index就只在该父容器内部生效,完全无法和外部同级元素比高低。
常见触发条件包括:opacity小于1、transform非none(哪怕只是translateZ(0))、filter、will-change、isolation: isolate。这些属性本身不带z-index,却会强制创建独立层级空间。
outline: 1px solid red快速定位,再移除transform或opacity验证是否恢复scale-95、blur-sm、opacity-95这类工具类,它们背后就是上述触发属性z-index只对已定位元素有效——即position必须是relative、absolute、fixed或sticky。设成static(默认值)时,无论写z-index: 9999还是z-[9999],浏览器根本不会处理。
position: relative,否则z-index形同虚设position: relative ≠ 子元素自动获得定位能力,子元素自己必须显式声明position: sticky有滚动边界限制,超出后退化为relative,此时z-index行为可能突变,需实测验证Tailwind v3+ 不再支持数组写法或extend.zIndex,所有z-类必须提前在theme.zIndex中以字符串键名定义,否则生成不出对应 CSS。
立即学习“前端免费学习笔记(深入)”;
zIndex: { 'modal-overlay': '60', 'tooltip': '40' }
zIndex: ['0', '10'](废弃)、extend: { zIndex: { 'modal-overlay': '60' } }(无效)、zIndex: { modal-overlay: '60' }(JS 解析失败)tailwind.config.js必须手动重启 dev server,JIT 模式不热重载配置变更z-[999]动态拼接:React 中class={`z-[${depth}]`}在构建时不会被扫描,生产环境必漏样式即使z-index: 9999,模态框仍可能被<iframe>、<video>或旧版<select>盖住——这不是 CSS 层级问题,而是浏览器把它们放在操作系统级合成层(OS compositor layer),物理上就压在普通 DOM 之上。
<iframe>添加allow="autoplay; fullscreen"并确保其容器z-index低于 modal 主容器wmode=transparent仅对老式 Flash 有效,现代场景下基本无效<body>直系下,避开所有中间容器的渲染层干扰opacity: 0.99、一行没配好的theme.zIndex、或者忘了加的position: relative,都足以让整个层级体系失效。