CSS 面试题
目录

请解释 z-index 属性的作用,以及它在什么情况下会失效?

· 约 5 分钟读完 · 第 46 / 99 章

推荐答案

z-index 属性用于控制元素的层叠顺序(即在 z 轴上的位置),数值越大,元素越靠近用户。z-index 仅在定位元素(position 属性值为 relative、absolute、fixed 或 sticky)上起作用。

z-index 失效的情况主要有以下几种:

  1. 元素未定位: 只有设置了 position 属性(除 static 外)的元素才能使用 z-index。
  2. z-index 值相同: 当多个定位元素的 z-index 值相同时,它们会按照在 HTML 中的出现顺序进行层叠,后出现的元素会覆盖先出现的元素。
  3. 祖先元素限制: 如果元素的祖先元素设置了 z-index 值,那么子元素的 z-index 值只能在其父元素的层叠上下文中生效。子元素的 z-index 值并不能超出其父元素的层叠上下文范围。
  4. 未创建层叠上下文: 某些 CSS 属性(如 opacity 小于 1,transform 不是 none,filter 不是 none 等)会创建新的层叠上下文,导致元素的 z-index 值只能在新的层叠上下文中生效。
  5. z-index 值为 auto: 默认情况下,元素的 z-index 值为 auto,此时元素会按照 HTML 中的出现顺序进行层叠。auto 值不会创建层叠上下文。
  6. **负值 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 小于 1
    • transform 不是 none
    • filter 不是 none
    • isolation 为 isolate
    • will-change 属性指定了会创建层叠上下文的属性
    • mix-blend-mode 不是 normal
    • contain 属性设置为 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 失效的情况时,通常需要检查层叠上下文是否正确创建,以及元素是否在同一个层叠上下文中。