# CSS 层叠上下文
# 概念
MDN CSS 层叠上下文 (opens new window)
我们假定用户正面向(浏览器)视窗或网页,而 HTML 元素沿着其相对于用户的一条虚构的 z 轴排开,层叠上下文就是对这些 HTML 元素的一个三维构想。众 HTML 元素基于其元素属性按照优先级顺序占据这个空间。
# 形成条件
文档中的层叠上下文由满足以下任意一个条件的元素形成:
- 文档根元素(<html>);
position
值为absolute
(绝对定位)或relative
(相对定位)且z-index
值不为auto
的元素;position
值为fixed
(固定定位)或sticky
(粘滞定位)的元素(沾滞定位适配所有移动设备上的浏览器,但老的桌面浏览器不支持);flex
(flexbox
) 容器的子元素,且z-index
值不为auto
;grid
(grid
) 容器的子元素,且z-index
值不为auto
;opacity
属性值小于 1 的元素(参见 the specification for opacity (opens new window));mix-blend-mode
属性值不为normal
的元素;- 以下任意属性值不为
none
的元素:transform
filter
perspective
clip-path
mask
/mask-image
/mask-border
isolation
属性值为isolate
的元素;-webkit-overflow-scrolling
属性值为touch
的元素;will-change
值设定了任一属性而该属性在non-initial
值时会创建层叠上下文的元素(参考这篇文章 (opens new window));contain
属性值为layout
、paint
或包含它们其中之一的合成值(比如contain: strict
、contain: content
)的元素。
在层叠上下文中,子元素同样也按照上面解释的规则进行层叠。 重要的是,其子级层叠上下文的 z-index 值只在父级中才有意义。子级层叠上下文被自动视为父级层叠上下文的一个独立单元。
总结: 层叠上下文可以包含在其他层叠上下文中,并且一起创建一个层叠上下文的层级。 每个层叠上下文都完全独立于它的兄弟元素:当处理层叠时只考虑子元素。 每个层叠上下文都是自包含的:当一个元素的内容发生层叠后,该元素将被作为整体在父级层叠上下文中按顺序进行层叠。
# z-index
z-index
属性设定了一个定位元素及其后代元素或 flex
项目的 z-order。 当元素之间重叠的时候, z-index
较大的元素会覆盖较小的元素在上层进行显示。
对于一个已经定位的盒子(即其 position
属性值不是 static
),z-index
属性指定:
- 盒子在当前堆叠上下文中的堆叠层级。
- 盒子是否创建一个本地堆叠上下文。取决与
z-index
的取值。
# z-index 的取值
auto
。盒子不会创建一个新的本地堆叠上下文。在当前堆叠上下文中生成的盒子的堆叠层级和父级盒子相同。integer
整数。是生成的盒子在当前堆叠上下文中的堆叠层级。此盒子也会创建一个堆叠层级为 0 的本地堆叠上下文。这意味着后代(元素)的 z-indexes 不与此元素的外部元素的 z-indexes 进行对比。