z-index不生效的首要原因是元素未定位;必须设置position为relative、absolute、fixed或sticky才能触发层叠上下文,static元素完全忽略z-index。
很多情况下写上 z-index 却没反应,根本原因是该元素没有触发「层叠上下文(stacking context)」。CSS 规定:z-index 只对 position 值为 relative、absolute、fixed 或 sticky 的元素生效,static(默认值)完全忽略 z-index。
position 是否被覆盖(比如父容器重置了子元素的 position)position: static 元素上徒劳设置 z-index
position 实际计算值父元素设置了 z-index(且自身已定位),就会创建新的层叠上下文——此时子元素的 z-index 只在该父容器内部生效,无法越过父级去和外部同级元素比高低。
.parent { position: relative; z-index: 10; } + .child { position: absolute; z-index: 999; },这个 999 仍低于外部 z-index: 20 的兄弟元素z-index,要么把子元素提到 DOM 更高位置(脱离该父层叠上下文)opacity 、transform 非 none、filter、will-change 等,也要小心连带影响
同属一个层叠上下文的定位元素,显示顺序由 z-index 数值决定:数值大的在上,相等时按 HTML 出现顺序(后写的盖住先写的)。
.box-a {
position: absolute;
z-index: 1;
}
.box-b {
position: absolute;
z-index: 3;
}
.box-c {
position: absolute;
z-index: 2;
}
上面三个元素将按 .box-a(最下)、.box-c(中间)、.box-b(最上)叠放。注意:z-index 支持负数,-1 会低于未设 z-index 的定位元素(其默认为 auto,等价于 0)。
大型项目容易出现 z-index: 999999 式滥用,导致后续维护困难、意外覆盖。更稳妥的做法是划分层级区间并预留余量。
z-index: 0–9
z-index: 10–99
z-index: 100–199
z-index: 1000+
--z-modal: 150;,再通过 z-index: var(--z-modal); 引用真正麻烦的不是数值本身,而是某处悄悄新建了一个层叠上下文,又没意识到它截断了整个层级链——这种问题往往要靠逐层检查 computed styles 才能定位。