z-index仅对position为relative、absolute、fixed或sticky的元素生效;父元素触发层叠上下文会限制子元素z-index作用范围;浮动元素需加position才参与z-index排序;子元素z-index再大也无法超越父级层叠层级。
这是最常踩的坑:写了 z-index: 999,但元素还是被盖住——打开开发者工具一看,position 是默认的 static。CSS 规定:z-index 只对 position 值为 relative、absolute、fixed 或 sticky 的元素生效,其余一律忽略。
.modal { position: fixed; z-index: 1000; }.modal { z-index: 1000; } /* 缺少 position,z-index 被浏览器直接丢弃 */position 才能参与层叠排序你以为子元素 z-index: 9999 很高,结果它只在父容器“内部楼层”里最高——出不去。这是因为父元素触发了层叠上下文(stacking context),比如加了 opacity: 0.99、transform: scale(1)、filter: blur(0),哪怕只是 position: relative + z-index: 0,也会形成独立“Z轴宇宙”。
opacity/transform 等隐式触发属性position: relative; z-index: 0)一旦元素设置了 float(比如 float: left),又没配 position,那它就属于“普通流中的浮动元素”,压根不进 z-index 排序队列——层叠顺序规则里它排在负 z-index 定位元素之后、块级非定位元素之前,z-index 对它完全无效。
@@##@@
position: relativeposition: relati
ve 改成 position: absolutefloat,改用 display: flex 或 grid 布局假设 .A 和 .B 是同级容器,.A 的 z-index: 1,.B 的 z-index: 2;那么无论 .A > .child 设成 9999,它也永远盖不住 .B 或 .B > .inner——因为层叠比较发生在父级之间,子级只能在自己父容器划定的“楼层区间”里排序。
z-index 计算值(开发者工具里看 Computed 样式):root { --z-modal: 1000; --z-tooltip: 1050; })层叠上下文不是玄学,但它确实不按直觉运行——你看到的“谁在上”,本质是浏览器按一套严格规则逐层计算出来的结果。别盲目调高数字,先确认定位、再检查上下文、最后比对父级层级,三步走完,90% 的 z-index 失效问题就解开了。