深入理解层叠上下文

129 阅读2分钟

在没有彻底理解层叠上下文之前,我一直以为谁的z-index大,谁就显示在全面,比如这样:

2153441-403c828170dbaa53.png

但是当页面复杂化的时候,层级嵌套非常深的时候,就容易出现各种奇奇怪怪的效果,比如这样:

截屏2022-12-18 下午9.47.50.png

  <div id="div2">
    z-index: 5
  </div>
  <div id="div3">
    <div id="div4">z-index: 6;</div>
    z-index: 4;
  </div>

在这个例子中,每个被定位的元素都创建了独自的层叠上下文,因为他们被指定了定位属性和 z-index 值。

但是为什么z-index5会覆盖z-index6呢?

请一定要注意 DIV #4 是 DIV #3 的子元素,所以它们的层叠完全在 DIV #3 中被处理。一旦 DIV #3 中的层叠和渲染处理完成,DIV #3 元素就被作为一个整体传递与兄弟元素的 DIV 在 root(根)元素进行层叠。

DIV #3 被渲染在 DIV #2 之下,因为 DIV #2 的 z-index (5) 而 DIV #3 的 z-index (4) 在 root 元素的层叠上下文中生效

而 DIV #4 的 z-index (6) 在 DIV #3 的层叠上下文中生效。因此,DIV #4 在 DIV #2 之下,因为 DIV #4 归属于 z-index 值较低的 DIV #3 元素。

说白了意思就是,子元素的层级受父元素的影响。其子级层叠上下文的 z-index 值只在父级中才有意义。子级层叠上下文被自动视为父级层叠上下文的一个独立单元。

分辨出层叠的元素在 Z 轴上的渲染顺序的一个简单方法是将它们想象成一系列的版本号,子元素是其父元素版本号之下的次要版本。

DIV #2 - z-index5
DIV #3 - z-index4
  DIV #4 - z-index6,在一个 z-index4 的元素内层叠,所以渲染次序为 4.6

通过这个方法我们可以轻松地看出为什么一个 z-index 为 5 的元素(DIV #2)层叠于一个 z-index 为 6 的元素(DIV #3)之上。