前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库嵌套层叠上下文 z-index 覆盖
CSS盒模型与排版

子元素 z-index 设成 9999,为什么还是盖不住另一个区域的元素?

不能。层叠上下文像一个封闭的图层组,子元素的 z-index 只在组内排序;到了外面,是父元素这一整组拿父元素自己的 z-index 去和别人比。父元素输了,里面的子元素 z-index 写多大都没用。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#盒模型与排版
先看核心答案读代码示例
理解线索

层叠上下文是一个整体

  1. 层叠上下文一组元素的层级范围,内部先排好序,再作为整体参与外部比较
  2. z-index只在元素所属的层叠上下文里有意义,不能跨组比较
  3. 祖先比较两个元素分属不同上下文时,找到它们在同一上下文里的祖先来比

很多层叠上下文不是 z-index 造成的。父元素一个 transform: translateZ(0) 或 opacity: 0.99,就能把里面的弹窗关进小盒子。

核心回答

先记住这个答案

不能。父元素一旦创建了层叠上下文,它的子元素就只在这个上下文内部按 z-index 排序。和外部元素比较时,参与比较的是父元素这个整体,用的是父元素自己的层级。所以如果父元素 A 的 z-index 是 1,另一个区域 B 是 2,A 里面的子元素写 z-index: 9999 也只能待在 B 的下面。

  • 子元素的 z-index 只在所在层叠上下文内部比较
  • 跨上下文比较的是两个祖先上下文的层级
  • 变换与透明度可建层叠上下文
  • 修法是提升父级层级,或把元素挪出去(Portal)

一个弹窗被遮住的例子

这是项目里最常见的场景:页面主体里弹出一个遮罩,结果被固定在顶部的导航栏压住了一截。

子元素 9999 输给了 2HTML
<style>
  .header { position: fixed; top: 0; z-index: 2; }
  .main { position: relative; z-index: 1; } /* 创建了层叠上下文 */
  .modal { position: fixed; inset: 0; z-index: 9999; }
</style>

<header class="header">导航栏</header>
<main class="main">
  <div class="modal">弹窗遮罩</div>
</main>
<!-- 结果:导航栏盖在弹窗上面 -->
<!-- 在根上下文里比较的是 .main(1) 和 .header(2),.modal 的 9999 不参与 -->

浏览器的思路是:根层叠上下文里有两个成员,.header 层级 2,.main 层级 1,所以 .header 在上。.modal 属于 .main 这个上下文,它的 9999 只用来和 .main 里的其他子元素比较。把 .main 的 z-index 删掉,或者改成 3,弹窗就能正常盖住导航栏。

怎么判断两个元素谁在上面

可以把层叠上下文想成文件夹。文件夹里的文件按 z-index 排好序,但文件夹放在桌面上时,只看文件夹本身的顺序。一个文件就算在文件夹里排第一,也不可能跑到另一个文件夹上面。

具体判断时,从两个元素分别往上找祖先,直到找到它们共同所在的那个层叠上下文。然后在这个上下文里,比较两边各自的「代表」,也就是直接属于这个上下文的那两个祖先(或元素本身)。代表的层级决定了整组的前后。上面的例子里,共同的上下文是根,两个代表是 .header 和 .main。

如果两个代表的 z-index 相同,就按 DOM 顺序,后出现的在上面。

哪些写法会意外创建层叠上下文

排查时最坑的是父元素根本没写 z-index,却还是把子元素关住了。因为能创建层叠上下文的远不止 z-index。

常见的「隐形」触发条件
定位元素(relative、absolute)加上非 auto 的 z-index 会创建;fixed 和 sticky 不管有没有 z-index 都会创建。另外还有 opacity 小于 1、transform 不为 none、filter 不为 none、isolation: isolate、will-change 指定了上面这些属性,以及 flex 或 grid 子项设置了 z-index。很多人为了开 GPU 加速给容器加 transform: translateZ(0),就是这样把里面的弹窗困住的。Chrome 开发者工具的 Layers 面板,或者逐个祖先检查这些属性,能很快定位是谁创建的上下文。
回答前,多想一步

容易答错的地方

以为 z-index 是全局比较的
z-index 从来不是全局排名,它只在同一个层叠上下文的兄弟之间比较。遇到盖不住的情况,一味往上加数字没有用,要先找到是哪个祖先创建了上下文。
以为没写 z-index 就没有层叠上下文
opacity、transform、filter、position: fixed 都会创建。父元素加了一个淡入动画,动画期间 opacity 小于 1,里面的下拉菜单就可能被别的区域盖住,动画结束又恢复,这种时好时坏的问题最难查。
试着用自己的话回答

面试官还会怎么问?

弹窗、下拉菜单这类组件库一般怎么避免这个问题?

把弹层渲染到 body 下面,脱离业务组件的 DOM 层级。React 用 createPortal,Vue 用 Teleport,antd、Element 的弹层默认都挂在 body 上。这样弹层直接处在根层叠上下文里,只需要和其他顶层元素比 z-index。

z-index: auto 和 z-index: 0 有什么区别?

对定位元素来说,auto 不创建层叠上下文,子元素还是参与外层比较;0 会创建层叠上下文,把子元素关在里面。两者在外层的绘制位置相同,都排在层级 0 这一档,区别只在会不会把子元素圈起来。

isolation: isolate 有什么用?

它只做一件事:创建层叠上下文,不附带定位、透明度等副作用。适合在组件根节点上用,把组件内部的 z-index 封起来,避免内部的层级数字和页面其他地方互相打架。

从一道题,走向一组知识

把知识连起来

盒模型与排版

sticky 元素什么时候粘住,什么时候又被带走?吸顶导航怎么写?

position: sticky 本身就会创建层叠上下文,吸顶导航的层级问题常常就是这道题的翻版。

盒模型与排版

单行文本超出显示省略号要写哪几行 CSS,少一行为什么就不行?

截断文字的单元格若带悬浮提示,省略号由 text-overflow 控制,提示层被盖住则要查父级层叠上下文。

参考资料

  • CSS:盒模型与排版参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 一个弹窗被遮住的例子
  3. 怎么判断两个元素谁在上面
  4. 哪些写法会意外创建层叠上下文
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑