Skip to content

层叠上下文 (Stacking Context)

层叠上下文是 HTML 元素的三维概念,它决定了元素在 $Z$ 轴(用户视线方向)上的排列顺序。

核心概念

在 CSS 中,并不是 z-index 越大越靠前。元素的显示顺序是由层叠上下文层叠水平层叠顺序共同决定的。

如何触发层叠上下文?

一个元素并不会自动产生层叠上下文,除非满足以下任一条件:

  • 文档根元素 (<html>)。
  • 定位属性positionabsoluterelative,且 z-index 不为 auto
  • 固定/粘性定位position: fixedsticky
  • Flex/Grid 子元素:父级为 display: flex | grid,且子元素的 z-index 不为 auto
  • CSS3 新属性
    • opacity 小于 1。
    • transform 不为 none
    • filterperspectiveclip-path 不为 none
    • will-change 指定了上述属性(opacity, transform, filter等)。

层叠黄金法则 (拼爹原则)

  1. 同级比较:在同一个层叠上下文中,z-index 越大越靠上。
  2. 跨级比较:如果两个元素处于不同的层叠上下文中,先比较它们各自所属的父级层叠上下文
    • 案例:如果 A 元素的父级层叠上下文 z-index 是 1,B 元素的父级层叠上下文 z-index 是 2,那么无论 A 的 z-index 设置到 $9999$,它也永远在 B 的下面。

层叠顺序表(由下到上)

当元素都在同一个层叠上下文中时,遵循以下顺序:

  1. 层叠上下文的根元素背景和边框
  2. z-index
  3. 块级盒子 (Block-level)
  4. 浮动盒子 (Float)
  5. 内联盒子 (Inline/Inline-block)
  6. z-index: 0z-index: auto
  7. z-index