30. CSS 的 z-index & Stacking Context 的形成

Stacking Context


定义

Stacking Context是指对於HTML元素而言,有一个面向使用者的假想轴(z轴),
而元素会依据设定好的属性,沿着轴进行排列顺序,使元素产生堆叠。

The stacking context is a three-dimensional conceptualization of HTML elements along an imaginary z-axis relative to the user, who is assumed to be facing the viewport or the webpage. HTML elements occupy this space in priority order based on element attributes.

27. 解释 CSS 的 BFC(Block Formatting Context) 有提到,页面里的元素,预设会形成Block Formatting Context,并依照BFC的性质进行排版。

比较两者的话,可以想成对使用者而言:

  • Formatting Context 是对二维方向的排列(x轴/y轴) → 预设为由上而下、由左而右排列。
  • Stacking Context 则是三维方向的堆叠(z轴) → 决定面向使用者(视窗)的堆叠顺序。

性质

特定元素会受到z-index值而影响堆叠顺序,原因是这些元素形成了Stacking Context。

... the rendering order of certain elements is influenced by their z-index value. This occurs because these elements have special properties which cause them to form a stacking context.

会形成Stacking Context的情况包括:

  • Root element of the document <html>
  • position 为 absolute/ relative设定z-index
  • position 为 fixed/ sticky
  • flex/ grid container 的 child element 且 设定z-index
  • opacity值 < 1
  • 有设定 transform

z-index

  • 预设值为 0
  • 可以为负值,数字越小离使用者越远,反之越近。
  • z-index 在 position 不为预设值(static)时有效。

可以把 z-index 的值想成是渲染顺序:
先渲染1,然後渲染2,所以较晚渲染(数字较大)的元素会越靠上/靠近使用者。

这里借用MDN的范例:
https://ithelp.ithome.com.tw/upload/images/20211012/20129476FiONyXTLaH.png

层级关系:

  • div1 z-index:5;
  • div2 z-index:2;
  • div3 z-index:4;
    • div4 z-index:6;
    • div5 z-index:1;
    • div6 z-index:3;
  1. Stacking Context在不同层级的间各自独立
    → 意思是,不同层级的元素,z-index值并不互相影响。
    以上面设定的顺序而言,并不会从数字最小的div5开始渲染,而是从div1,2,3取最小值开始进行渲染。

  2. 没有产生Stacking Context的元素,会被父元素的Stacking Context同化(assimilated)。
    → 要注意**z-index的属性不会继承**,以范例而言,div4如果没有设定z-index,就是0,并不会是从div3继承4

因此可以推导出渲染顺序(堆叠顺序):
div2 (2) -> div3 (4) -> div5(4.1) -> div6(4.3) -> div4(4.6) -> div1(5)

【如内文有误还请不吝指教>< 并感谢阅览至此的各位:D 】

参考资料


<<:  【从零开始的Swift开发心路历程-Day30】认识GCD多执行绪Part3(完)

>>:  单元测试相关

【LeetCode】当初的 LeetCode 学习

有点受不了没什麽演算法底子还要掰出 Leetcode 文章QQ 今天来记录当初学习的过程和後来的想法...

每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day24

tags: ItIron2021 Javascript 前言 对点进来的你说一下,恭喜你撑到今天! ...

30天轻松学会unity自制游戏-简易介绍google play上架

上架google play要先跟google缴交$25美元终生上架费用@@如果有钱有设备也可以申请a...

第 03 天 略有灵感小步迈进( leetcode 011 )

https://leetcode.com/problems/container-with-most...

[Day 22]从零开始学习 JS 的连续-30 Days---阵列操作介绍 (下篇)

阵列操作介绍 (下篇) 介绍四种阵列运用: map filter find findlndex 3....