推荐答案
z-index 属性用于控制元素的层叠顺序(即在 z 轴上的位置),数值越大,元素越靠近用户。z-index 仅在定位元素(position 属性值为 relative、absolute、fixed 或 sticky)上起作用。
z-index 失效的情况主要有以下几种:
- 元素未定位: 只有设置了
position属性(除static外)的元素才能使用z-index。 z-index值相同: 当多个定位元素的z-index值相同时,它们会按照在 HTML 中的出现顺序进行层叠,后出现的元素会覆盖先出现的元素。- 祖先元素限制: 如果元素的祖先元素设置了
z-index值,那么子元素的z-index值只能在其父元素的层叠上下文中生效。子元素的z-index值并不能超出其父元素的层叠上下文范围。 - 未创建层叠上下文: 某些 CSS 属性(如
opacity小于 1,transform不是none,filter不是none等)会创建新的层叠上下文,导致元素的z-index值只能在新的层叠上下文中生效。 z-index值为auto: 默认情况下,元素的z-index值为auto,此时元素会按照 HTML 中的出现顺序进行层叠。auto值不会创建层叠上下文。- **负值
z-index:**负值的z-index可以将元素放置在普通流元素或无定位的元素后面。但是,如果它的父元素在它之前已经叠放了其他元素,那么这个负值也仅仅在父元素的层叠上下文中起作用。
本题详细解读
z-index 属性是 CSS 中一个非常重要的概念,它决定了元素在视觉上的层叠顺序。理解 z-index 的工作原理和失效场景对于前端开发至关重要。
1. z-index 的作用:
- 层叠上下文:
z-index的作用范围是层叠上下文。层叠上下文是由某些元素创建的,例如根元素 (html),定位元素,以及一些特定 CSS 属性影响下的元素。层叠上下文可以被理解为一个独立的“图层”,在这个“图层”内部,元素的层叠顺序由其z-index值决定。 - 数值大小:
z-index接受整数值,数值越大,元素在层叠顺序中越靠前(越靠近用户)。负值可以使元素层叠在其他元素之下。 - 默认值
auto: 默认情况下,元素的z-index值为auto,此时,元素的层叠顺序由其在 HTML 中的出现顺序决定,后出现的元素会覆盖先出现的元素。auto不会创建新的层叠上下文。
2. z-index 失效的情况:
- 未定位元素:
z-index只能应用于position属性值不为static的定位元素。对于默认的static元素,z-index没有任何效果。 - 相同
z-index值: 如果多个定位元素有相同的z-index值,那么它们的层叠顺序由它们在 HTML 中的出现顺序决定。后出现的元素会覆盖先出现的元素。 - 祖先元素限制: 当一个元素处于某个层叠上下文中时,它的
z-index值只能在该层叠上下文内生效。如果一个元素的祖先元素有z-index值,那么该元素不能突破祖先元素的层叠限制。- 例如,如果一个父元素的
z-index为 1,一个子元素的z-index为 10,子元素虽然z-index值更大,但依旧会显示在父元素之下。
- 例如,如果一个父元素的
- 层叠上下文的影响: 当一个元素创建了新的层叠上下文时,它的子元素只能在这个新的层叠上下文内部比较
z-index。 常见的创建新的层叠上下文的 CSS 属性包括:opacity小于 1transform不是nonefilter不是noneisolation为isolatewill-change属性指定了会创建层叠上下文的属性mix-blend-mode不是normalcontain属性设置为layout,paint或者composite
- 负值
z-index: 负值的z-index可以将元素放置在其他普通流元素或没有定位的元素后面,但负值z-index也仅仅在当前层叠上下文中起作用,不能突破父元素的层叠上下文。
3. 层叠上下文的创建:
层叠上下文不仅由 z-index 创建。以下这些情况会创建层叠上下文:
- 根元素 (HTML)
position值为absolute或relative且z-index值不为auto的元素position值为fixed或sticky的元素- flex (flex items) 的容器,并
z-index值不为auto - grid (grid items) 的容器,并
z-index值不为auto opacity值小于 1 的元素transform值不为none的元素filter值不为none的元素isolation值为isolate的元素will-change指定了任一属性的元素,并且会创建层叠上下文mix-blend-mode值不为normal的元素contain值为layout,paint或composite的元素
理解层叠上下文的概念对于正确使用 z-index 非常重要。当遇到 z-index 失效的情况时,通常需要检查层叠上下文是否正确创建,以及元素是否在同一个层叠上下文中。