前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 热点
旧版
首页程序员面试题库position relative z-index auto 层叠上下文
CSS盒模型与排版

position: relative 配 z-index: auto,会创建层叠上下文吗?

不会。z-index: auto 表示「我不单独成层」,元素只是按定位元素的顺序被画在上层,它的子元素仍然到外面那个层叠上下文里和别人比 z-index。只有定位元素的 z-index 写成整数(包括 0),才会创建新的层叠上下文,把子元素关在里面。

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

`auto` 和整数的区别

  1. z-index: auto元素自己在当前上下文里按 DOM 顺序画,子元素直接参与外层比较
  2. z-index: 0 或其他整数元素自成一个层叠上下文,子元素只在内部比较,整体按这个数值参与外层排序
  3. 其他触发条件opacity 小于 1、transform、filter、isolation: isolate、position: fixed 等

z-index: auto 和 z-index: 0 在兄弟之间的上下关系完全一样,差别只体现在子元素身上。所以只看这个元素本身,很难发现两者不同。

核心回答

先记住这个答案

不会创建。position: relative 加 z-index: auto 的元素,只是在当前层叠上下文里被归到「定位元素」这一层,按 DOM 顺序画在普通元素上面,它自己不成为一个独立的层。它的子元素如果写了 z-index,会直接到外面那个层叠上下文里和其他元素比较。一旦把 z-index 改成整数,哪怕是 0,这个元素就创建了新的层叠上下文:它和它的所有后代被当成一个整体参与外层排序,子元素的 z-index 只在内部有效。

  • auto 不建层叠上下文,0 会
  • auto 时后代可参与外层比较
  • 创建层叠上下文后,子元素 z-index 再大也出不去
  • 透明度与变换也可建层叠上下文

从一个被遮住的角标说起

页面顶部有一个固定层级的导航栏,下面的卡片右上角有个角标,需要叠到导航栏上面。

auto 和 0 只差一个值,结果完全相反HTML
<style>
  .nav   { position: relative; z-index: 5; }
  .card  { position: relative; z-index: auto; } /* 改成 0 试试 */
  .badge { position: absolute; top: -20px; z-index: 10; }
</style>

<div class="nav">导航栏</div>
<div class="card">
  <span class="badge">NEW</span>
</div>
<!-- .card 为 auto:角标 10 和导航栏 5 直接比较,角标在上 -->
<!-- .card 为 0:卡片整体是 0,小于导航栏的 5,角标被压在导航栏下面 -->

.card 是 auto 时它不成层,角标的 z-index: 10 和导航栏的 5 在同一个上下文里比较,10 大,所以角标在上面。 .card 改成 z-index: 0 后,卡片自成一层,外面看来卡片整体的层级就是 0。角标的 10 只在卡片内部有效,出不去,整个卡片连同角标都在导航栏下面。这就是「子元素 z-index: 9999 也没用」的典型原因。

为什么是「定位元素加数值」才算

z-index 最早只对定位元素生效,position: static 的普通元素写了也会被忽略。所以规范里创建层叠上下文最经典的条件就是:position 为 relative 或 absolute,并且 z-index 不是 auto。

auto 的含义
auto 是 z-index 的初始值,意思是「跟随父级上下文,不单独建层」。整数值的意思是「在父级上下文里占据这个层级,并且我自己是一个新的上下文」。0 虽然在数值上和默认位置一样,但它是一个明确的整数,所以也会建层。 后来规范加了很多条件,不依赖定位也会创建层叠上下文,所以「定位元素加数值才会」这句话是历史上的核心规则,但不是全部。

不靠定位也会创建层叠上下文的情况

排查层级问题时,只盯着 z-index 常常找不到原因,因为下面这些属性也会默默创建层叠上下文。

常见的触发条件
position: fixed 和 position: sticky 不写 z-index 也会创建。opacity 小于 1、transform 不为 none、filter 不为 none、mix-blend-mode 不为 normal、isolation: isolate、will-change 指定了上面这些属性,也都会创建。flex 和 grid 的子项不需要定位,写了整数 z-index 也会创建。 实际项目里最容易踩的是动画。给卡片加了 transform 做悬停放大,卡片就成了层叠上下文,里面的下拉菜单从此被下一张卡片盖住。
回答前,多想一步

容易答错的地方

以为 z-index: auto 就等于 z-index: 0
对兄弟元素来说,两者画的位置确实一样,都在定位元素那一层按 DOM 顺序排。区别在子元素:auto 放子元素出去比较,0 把子元素关在里面。
以为子元素 z-index 写得足够大就能盖住一切
子元素的 z-index 只在它所在的层叠上下文里有效。只要某个祖先创建了层叠上下文,并且这个祖先整体比别人低,子元素写多少都没用。要么调整祖先的层级,要么用 Portal 把弹层渲染到 body 下。
以为给普通元素写 z-index 也能创建层叠上下文
position: static 的块元素写 z-index 不生效,也不会创建层叠上下文。flex 和 grid 的子项例外。
试着用自己的话回答

面试官还会怎么问?

想让组件内部的层级不影响外部,最干净的写法是什么?

给组件根元素加 isolation: isolate。它唯一的作用就是创建层叠上下文,不需要定位,也不需要随便挑一个 z-index 数值,组件内部的 z-index 就再也漏不出去。

在 DevTools 里怎么找是谁创建了层叠上下文?

Chrome 的 Layers 面板能看到合成层,但层叠上下文和合成层不完全是一回事。更直接的办法是从出问题的元素往上逐个看祖先的计算样式,检查 z-index、opacity、transform、filter、position: fixed 这些属性。

position: absolute 配 z-index: auto 呢?

和 relative 一样,不会创建层叠上下文。relative 和 absolute 在这件事上没有区别,fixed 和 sticky 才会无条件创建。

从一道题,走向一组知识

把知识连起来

盒模型与排版

相对定位的元素设置了 top、left,旁边的元素会跟着动吗?

同样是 position: relative,那一题讲它的偏移为什么不影响其他元素的位置。

盒模型与排版

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

父元素一旦创建层叠上下文,子元素 z-index 写多大都盖不过父元素的兄弟,那一题专门讲这种嵌套比较。

参考资料

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

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

本题目录
  1. 先记住这个答案
  2. 从一个被遮住的角标说起
  3. 为什么是「定位元素加数值」才算
  4. 不靠定位也会创建层叠上下文的情况
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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