层叠上下文
灵感胜于汗水 Lv5

层叠上下文

我们假定用户正面向(浏览器)视窗或网页,而 HTML 元素沿着其相对于用户的一条虚构的 z 轴排开,层叠上下文就是对这些 HTML 元素的一个三维构想。众 HTML 元素基于其元素属性按照优先级顺序占据这个空间。

层叠水平

  1. 层叠水平决定了同一个层叠上下文中元素在z轴上的显示顺序。

  2. 普通元素的层叠水平优先由层叠上下文决定,因此,层叠水平的比较只有在当前层叠上下文元素中才有意义。

注意:千万不要把层叠水平和CSSz-index属性混为一谈。某些情况下z-index确实可以影响层叠水平,但是,只限于定位元素以及flex盒子的孩子元素;而层叠水平所有的元素都存在。

层叠顺序

元素发生层叠时候有着特定的垂直显示顺序,层叠顺序从小到大如下:

  1. background / border
  2. 负z-index
  3. block块级水平盒子
  4. float浮动盒子
  5. inline / inline-block水平盒子
  6. z-index: auto / z-index: 0 / 不依赖z-index的层叠上下文
  7. 正z-index

生成层叠上下文

  1. HTML中的根元素<html></html>本身就具有层叠上下文,称为“根层叠上下文”;
  2. 普通元素设置position属性为非static值并设置z-index属性为具体数值,产生层叠上下文;
  3. 父元素的display属性值为flex|inline-flex|grid,子元素z-index属性值不为auto的时候,子元素为层叠上下文元素;
  4. 元素的opacity属性值不是1
  5. 以下任意属性值不为none的元素:
    • transform
    • filter
    • backdrop-filter
    • perspective
    • clip-path
    • mask / mask-image / mask-border
  6. 元素mix-blend-mode属性值不是normal
  7. 元素的isolation属性值是isolate
  8. will-change指定的属性值为上面任意一个;
  9. 元素的-webkit-overflow-scrolling属性值设置为touch

层叠上下文的特点

  1. 谁大谁上:当具有明显的层叠水平标示的时候,如识别的z-indx值,在同一个层叠上下文领域,层叠水平值大的那一个覆盖小的那一个。通俗讲就是官大的压死官小的。
  2. 后来居上:当元素的层叠水平一致、层叠顺序相同的时候,在DOM流中处于后面的元素会覆盖前面的元素。
  3. 在层叠上下文中,子元素同样也按照上面解释的规则进行层叠。重要的是,其子级层叠上下文的 z-index 值只在父级中才有意义。子级层叠上下文被自动视为父级层叠上下文的一个独立单元。
  4. 层叠上下文可以包含在其他层叠上下文中,并且一起创建一个层叠上下文的层级。
  5. 每个层叠上下文都完全独立于它的兄弟元素:当处理层叠时只考虑子元素。
  6. 每个层叠上下文都是自包含的:当一个元素的内容发生层叠后,该元素将被作为整体在父级层叠上下文中按顺序进行层叠。

总结

  1. 先看要比较的两个元素是否处于同一个层叠上下文中。如果是,谁的层叠水平大,谁在上面。
  2. 如果两个元素不在同一层叠上下文中,请先比较他们所处的层叠上下文的层叠水平。 当两个元素层叠水平相同、层叠顺序相同时,在DOM结构中后面的元素层叠等级在前面元素之上。

参考

  • 本文标题:层叠上下文
  • 本文作者:灵感胜于汗水
  • 创建时间:2022-10-17 21:31:54
  • 本文链接:https://cjhsyc.github.io/2022/10/17/层叠上下文/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!