← 返回题目列表

z-index 为什么有时不生效?什么是层叠上下文?

高频 中等 第 18 / 28 题 更新于 2026/07/28
CSSz-index层叠上下文定位布局

简化版

z-index 只在层叠上下文里比较,元素一旦被父级的 transform、opacity、position + z-index 等条件创建了新的层叠上下文,它和外部元素就不是直接比较大小了。所以 z-index 不生效时,通常不是数字不够大,而是比较范围错了。

详细版

  • z-index 控制的是当前层叠上下文内的层级顺序,不是全页面绝对顺序。
  • position 非 static 且设置 z-index、opacity 小于 1、transform、filter、isolation 等都会创建新的层叠上下文。
  • 子元素的 z-index 再大,也只能在父层叠上下文内部参与排序。
  • 排查时要沿 DOM 向上找最近的 stacking context,而不是盲目写 9999。
  • 工程上建议建立弹层层级规范,例如 dropdown、modal、toast、tooltip 使用统一 token。

完整版教学

记忆钩子:z-index 比的是“同一个房间里的座次”,不是整栋楼里的绝对高度。

一、这题真正考什么

记忆钩子:z-index 比的是“同一个房间里的座次”,不是整栋楼里的绝对高度。

面试官不是只想听定义,而是想看你能不能把 CSS 规则、浏览器渲染、工程维护和用户体验连起来。回答这类题时,先讲机制,再讲例子,最后讲排查方法和边界。

二、底层机制怎么理解

层叠上下文是浏览器在 z 轴上组织元素绘制顺序的隔离单元。一个元素创建层叠上下文后,它的所有子元素先在内部排好顺序,再作为一个整体参与父级上下文排序。这样可以让复杂页面的绘制规则保持确定性,但也会让开发者误以为 z-index 数字越大越靠上。

CSS 面试题的关键通常在“规则为什么这样生效”。只要能讲清浏览器按什么顺序匹配、计算、布局和绘制,就不会停留在背属性名的层面。

三、带数字的小推演

父元素 A 设置 transform: translateZ(0) 创建层叠上下文,父元素 B 设置 z-index: 10。A 内部子元素即使写 z-index: 9999,如果 A 自己在父级上下文里低于 B,子元素也压不过 B。

下面把判断过程压成几条可复用规则,面试时可以直接照这个顺序推:

比较层级时先比较所在 stacking context
同一上下文:z-index 大的在上;z-index 相同时按绘制规则和 DOM 顺序
不同上下文:先比较父上下文里的父元素顺序,子元素不能越级竞争

四、浏览器处理流程

可以把它放进浏览器处理链路里看:

页面根层叠上下文
   |
父元素 A:transform 创建局部上下文
   |     |
   |     A-child: z-index 9999,只在 A 内部比较
   |
父元素 B:z-index 10
   |
最终先比较 A 和 B,再看各自内部

流程图能帮你避免两个常见问题:一是把 CSS 属性当成孤立开关,二是忽略父级、上下文和渲染阶段的影响。真正排查线上样式问题时,沿流程定位通常比随机改 CSS 更快。

五、对比表格

触发条件是否常见典型场景
position + z-index弹层、定位布局
opacity < 1淡入动画
transform/filter动画、硬件加速
isolation: isolate主动隔离层级
flex/grid item + z-index组件内部排序

对比题不要只背结论,要主动补一句“适合什么场景”。CSS 的很多选择没有绝对优劣,只有是否符合布局、可维护性、性能和可访问性目标。

六、工程实践和排查思路

  • 盲目把 z-index 加到 9999 会污染全局层级系统,也不一定能解决跨上下文问题。
  • 动画里加 transform 可能无意创建层叠上下文,让原本正常的弹层被遮住。
  • 使用 DevTools 时要同时看 matched rules、computed style、layout、accessibility 和 event listeners,避免只盯着源码。
  • 组件库项目要把这类规则沉淀成 token、基础样式或 lint 约束,否则同类问题会反复出现。

七、常见误区与追问

  • 误区:z-index 数字越大就一定越靠上。 需要补上浏览器机制、适用条件和反例,避免把经验口诀当成规则本身。
  • 误区:只有定位元素才可能参与层级排序。 需要补上浏览器机制、适用条件和反例,避免把经验口诀当成规则本身。
  • 误区:z-index 不生效就应该继续加大数值。 需要补上浏览器机制、适用条件和反例,避免把经验口诀当成规则本身。
  • 追问:哪些属性会创建层叠上下文? 先给判断标准,再结合代码、浏览器行为和工程约束说明取舍。
  • 追问:modal、toast、tooltip 的层级应该如何治理? 先给判断标准,再结合代码、浏览器行为和工程约束说明取舍。
  • 追问:为什么 transform 会影响 fixed 元素的表现? 先给判断标准,再结合代码、浏览器行为和工程约束说明取舍。

八、加强记忆

先找“房间”,再比“座次”。排查 z-index 问题时,从目标元素一路向上找层叠上下文,确认它和遮挡元素是否在同一个比较范围里。

复习 HTML/CSS 高频题时,可以固定按“定义、触发条件、浏览器流程、代码例子、工程风险、排查工具”六步组织答案。这样不会只停留在背概念,也更像真实前端开发者。