跬步-CSS层叠


屏幕是一个二维平面,然而 HTML 元素却是排列在三维坐标系中,x 为水平位置,y 为垂直位置,z 为屏幕由内向外方向的位置,我们在看屏幕的时候是沿着 z 轴方向从外向内的;由此,元素在用户视角就形成了层叠的关系,某个元素可能覆盖了其他元素也可能被其他元素覆盖;

层叠

层叠上下文

层叠上下文 (堆叠上下文, Stacking Context),是 HTML 中一个三维的概念。在 CSS2.1 规范中,每个元素的位置是三维的,当元素发生层叠,这时它可能覆盖了其他元素或者被其他元素覆盖;排在 z 轴越靠上的位置,距离屏幕观察者越近

可以想象一张桌子,上面有一堆物品,这张桌子就代表着一个层叠上下文。 如果在第一张桌子旁还有第二张桌子,那第二张桌子就代表着另一个层叠上下文。
现在想象在第一张桌子上有四个小方块,他们都直接放在桌子上。 在这四个小方块之上有一片玻璃,而在玻璃片上有一盘水果。 这些方块、玻璃片、水果盘,各自都代表着层叠上下文中一个不同的层叠层,而这个层叠上下文就是桌子。
每一个网页都有一个默认的层叠上下文。 这个层叠上下文(桌子)的根源就是<html></html>html 标签中的一切都被置于这个默认的层叠上下文的一个层叠层上(物品放在桌子上)。
当你给一个定位元素赋予了除 auto 外的 z-index 值时,你就创建了一个新的层叠上下文,其中有着独立于页面上其他层叠上下文和层叠层的层叠层, 这就相当于你把另一张桌子带到了房间里。

层叠

层叠上下文 1 (Stacking Context 1)是由文档根元素形成的, 层叠上下文 2 和 3 (Stacking Context 2, 3) 都是层叠上下文 1 (Stacking Context 1) 上的层叠层。 他们各自也都形成了新的层叠上下文,其中包含着新的层叠层。

形成层叠上下文的方法有:

  • 根元素<html></html>
  • position 值为 absolute | relative,且 z-index 值不为 auto
  • position 值为 fixed | sticky
  • z-index 值不为 autoflex 元素,即:父元素 display: flex | inline-flex
  • opacity 属性值小于 1 的元素
  • transform 属性值不为 none 的元素
  • mix-blend-mode 属性值不为 normal 的元素
  • filterperspectiveclip-pathmaskmask-imagemask-bordermotion-path 值不为 none 的元素
  • perspective 值不为 none 的元素
  • isolation 属性被设置为 isolate 的元素
  • will-change 中指定了任意 CSS 属性,即便你没有直接指定这些属性的值
  • -webkit-overflow-scrolling 属性被设置 touch 的元素

总结

  • 层叠上下文可以包含在其他层叠上下文中,并且一起组建了一个有层级的层叠上下文
  • 每个层叠上下文完全独立于它的兄弟元素,当处理层叠时只考虑子元素,这里类似于 BFC
  • 每个层叠上下文是自包含的:当元素的内容发生层叠后,整个该元素将会在父级叠上下文中按顺序进行层叠

层叠等级

层叠等级 (层叠水平, Stacking Level) 决定了同一个层叠上下文中元素在 z 轴上的显示顺序的概念;

  1. 普通元素的层叠等级优先由其所在的层叠上下文决定
  2. 层叠等级的比较只有在同一个层叠上下文元素中才有意义
  3. 在同一个层叠上下文中,定位元素的层叠等层叠等级描述定义的是该层叠上下文中的元素在 Z 轴上的上下顺序

层叠顺序

层叠顺序 (层叠次序, 堆叠顺序, Stacking Order) 描述的是元素在同一个层叠上下文中的顺序规则,从层叠的底部开始,共有七种层叠顺序:

扫描二维码关注公众号,回复: 5006305 查看本文章
  1. 背景和边框:形成层叠上下文的元素的背景和边框。
  2. 负 z-index 值:层叠上下文内有着负 z-index 值的定位子元素,负的越大层叠等级越低;
  3. 块级盒:文档流中块级、非定位子元素;
  4. 浮动盒:非定位浮动元素;
  5. 行内盒:文档流中行内、非定位子元素;
  6. z-index: 0:z-index 为 0 或 auto 的定位元素, 这些元素形成了新的层叠上下文;
  7. 正 z-index 值:z-index 为正的定位元素,正的越大层叠等级越高;

同一个层叠顺序的元素按照在 HTML 里出现的顺序层叠;第 7 级顺序的元素会显示在之前顺序元素的上方,也就是看起来覆盖了更低级的元素:
层叠顺序

z-index

z-index 只适用于定位的元素,对非定位元素无效,它可以被设置为正整数、负整数、0、auto,如果一个定位元素没有设置 z-index,那么默认为 auto;

元素的 z-index 值只在同一个层叠上下文中有意义。如果父级层叠上下文的层叠等级低于另一个层叠上下文的,那么它 z-index 设的再高也没用。所以如果你遇到 z-index 值设了很大,但是不起作用的话,就去看看它的父级层叠上下文是否被其他层叠上下文盖住了。

总结

层叠排序时,在对同一个层叠内所有元素进行排序,再对每一个形成层叠的元素内部进行逐级深入排序

猜你喜欢

转载自blog.csdn.net/Basarawade/article/details/86570264