CSS 中 z-index 的工作原理是什么?
解释 CSS z-index 属性的工作原理及其对元素层叠的影响。
z-index 是 CSS 属性,用于控制元素在页面上的层叠顺序,其作用是根据值决定显示优先级,使元素在垂直的 Z 轴上堆叠(数值大者更靠前)。它仅在特定定位的元素上生效,且依赖于「堆叠上下文」机制。以下是具体工作方式:
z-index 的基本工作原理
- 依赖属性条件:z-index 仅对具有以下定位的元素生效:
position: relative | absolute | fixed | sticky
- 或作为 CSS Grid 或 Flexbox 的直系子元素时设定具体 z-index 值。
若元素为position: static
(默认值),z-index 会被忽略。/* 示例: 仅在有定位时才生效 */ .element { position: relative; z-index: 10; /* 此项有效 */ }
- 取值范围:
auto
:默认值,不创建堆叠上下文,层级由父级继承。<integer>
:整数(正负值或零),如2
或-1
。值越大越前、越小越后(浏览器支持范围: -2147483647 至 2147483647)。inherit
:直接继承父级 z-index。
z-index 的工作核心—「堆叠上下文」
「堆叠上下文」(stacking context)是元素的分层分组模型:
- 创建条件:在满足以下情况时形成新的堆叠上下文,约束子元素的层次关系:
position
非static
且z-index
不为auto
(如 z-index:0)。- 元素透明度
opacity < 1
时。 - 使用
transform
、filter
或 CSS Grid/Flexbox 布局的直系子元素时。
- 层级约束规则:
- 元素层级仅限在同一堆叠上下文中比较:同级元素 z-index 大者在前,同值时文档后出现者居上。
- 子元素不受跨上下文的层级影响(即仅同层级 siblings 比较 z-index);层级高低取决于创建堆叠上下文的祖先值。
/* 示例: 父堆叠上下文制约子元素 */ .parent { position: relative; z-index: 1; /* 创建上下文; .child 层级受父级控制 */ } .child { z-index: 100; /* 在此堆叠上下文内有效, 不能超越外层元素 */ }
关键应用规则
- z-index 为
0
:创建堆叠上下文,但不改变自身与未定义元素的层级顺序。 - 负值作用:如
-1
使元素位于堆叠层级更后方(在普通文档流之下),一般仅受当前层叠上下文约束。 - 相同堆叠级元素:无明确值时靠后出现优先级高;若层级定义矛盾(如嵌套时值非自动),需按最近祖先值判断堆叠关系。
- 优先级错位:父元素不创建堆叠上下文时子元素值可比拟外层,否则跨堆叠上下文无法比较内部值高者与外部低值者的高低。
- 特殊情况:设置透明度(opacity)可能影响堆叠表现;值重复时解析依赖于浏览器渲染引擎判断。
使用建议
- 定位后应用 z-index:确认元素具备非 static 定位再设置堆叠值。
- 负值用于隐藏背景元素。
- 值设定时限制在安全整数范围以避免跨浏览器问题。