什么是层叠上下文?如何形层叠上下文?层叠顺序是怎样的? àì夳堔傛蜴生んèń 2021-12-23 16:45 417阅读 0赞 在[CSS2.1规范][CSS2.1]中,每个盒模型的位置是三维的,分别是平面画布上的x轴,y轴以及表示层叠的z轴。层叠上下文即元素在某个层级上z轴方向的排列关系。 那么这里有几个重要的概念:**层叠上下文** (堆叠上下文, Stacking Context)、**层叠等级** (层叠水平, Stacking Level)、**层叠顺序** (层叠次序, 堆叠顺序, Stacking Order)、**z-index。** ## 1. 层叠上下文 (Stacking Context) ## 文章<关于z-index 那些你不知道的事>有一个很好的比喻,这里引用一下; 可以想象一张桌子,上面有一堆物品,这张桌子就代表着一个层叠上下文。 如果在第一张桌子旁还有第二张桌子,那第二张桌子就代表着另一个层叠上下文。 现在想象在第一张桌子上有四个小方块,他们都直接放在桌子上。 在这四个小方块之上有一片玻璃,而在玻璃片上有一盘水果。 这些方块、玻璃片、水果盘,各自都代表着层叠上下文中一个不同的层叠层,而这个层叠上下文就是桌子。 每一个网页都有一个默认的层叠上下文。 这个层叠上下文(桌子)的根源就是 `<html></html>`。 html标签中的一切都被置于这个默认的层叠上下文的一个层叠层上(物品放在桌子上)。 当你给一个定位元素赋予了除 `auto` 外的 z-index 值时,你就创建了一个新的层叠上下文,其中有着独立于页面上其他层叠上下文和层叠层的层叠层, 这就相当于你把另一张桌子带到了房间里。 ![1620][] 层叠上下文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` 值不为 `auto` 的flex元素,即:父元素 `display:flex|inline-flex` * `opacity` 属性值小于 `1` 的元素 * `transform` 属性值不为 `none`的元素 * `mix-blend-mode` 属性值不为 `normal` 的元素 * `filter`、 `perspective`、 `clip-path`、 `mask`、 `mask-image`、 `mask-border`、 `motion-path` 值不为`none` 的元素 * `perspective` 值不为 `none` 的元素 * `isolation` 属性被设置为 `isolate` 的元素 * `will-change` 中指定了任意 CSS 属性,即便你没有直接指定这些属性的值 * `-webkit-overflow-scrolling` 属性被设置 `touch`的元素 总结: 1. 层叠上下文可以包含在其他层叠上下文中,并且一起组建了一个有层级的层叠上下文 2. 每个层叠上下文完全独立于它的兄弟元素,当处理层叠时只考虑子元素,这里类似于BFC 3. 每个层叠上下文是自包含的:当元素的内容发生层叠后,整个该元素将会**在父级叠上下文**中按顺序进行层叠 ## 2. 层叠等级 (Stacking Level) ## **层叠等级** (层叠水平, Stacking Level) 决定了同一个层叠上下文中元素在z轴上的显示顺序的**概念**; * 普通元素的层叠等级优先由其所在的层叠上下文决定 * 层叠等级的比较只有在同一个层叠上下文元素中才有意义 * 在同一个层叠上下文中,层叠等级描述定义的是该层叠上下文中的元素在Z轴上的上下顺序 注意,层叠等级并不一定由 z-index 决定,只有定位元素的层叠等级才由 z-index 决定,其他类型元素的层叠等级由层叠顺序、他们在HTML中出现的顺序、他们的父级以上元素的层叠等级一同决定,详细的规则见下面层叠顺序的介绍。 ## 3. z-index ## > 在 CSS 2.1 中, 所有的盒模型元素都处于三维坐标系中。 除了我们常用的横坐标和纵坐标, 盒模型元素还可以沿着"z 轴"层叠摆放, 当他们相互覆盖时, z 轴顺序就变得十分重要。 z-index 只适用于定位的元素,对非定位元素无效,它可以被设置为正整数、负整数、0、auto,如果一个定位元素没有设置 z-index,那么默认为auto; 元素的 z-index 值只在同一个层叠上下文中有意义。如果父级层叠上下文的层叠等级低于另一个层叠上下文的,那么它 z-index 设的再高也没用。所以如果你遇到 z-index 值设了很大,但是不起作用的话,就去看看它的父级层叠上下文是否被其他层叠上下文盖住了。 ## 4. 层叠顺序 (Stacking Order) ## 这里其实是涉及了所谓的层叠水平(stacking level),有一张图可以很好的诠释: ![1620 1][] 运用上图的逻辑,上面的题目就迎刃而解,`inline-blcok` 的 `stacking level` 比之 `float` 要高,所以无论 DOM 的先后顺序都堆叠在上面。 不过上面图示的说法有一些不准确,按照 [W3官方][W3] 的说法,准确的 7 层为: 1. the background and borders of the element forming the stacking context. 2. the child stacking contexts with negative stack levels (most negative first). 3. the in-flow, non-inline-level, non-positioned descendants. 4. the non-positioned floats. 5. the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks. 6. the child stacking contexts with stack level 0 and the positioned descendants with stack level 0. 7. the child stacking contexts with positive stack levels (least positive first). 稍微翻译一下: 1. 形成堆叠上下文环境的元素的背景与边框 2. 拥有负 `z-index` 的子堆叠上下文元素 (负的越高越堆叠层级越低) 3. 正常流式布局,非 `inline-block`,无 `position` 定位(static除外)的子元素 4. 无 `position` 定位(static除外)的 float 浮动元素 5. 正常流式布局, `inline-block`元素,无 `position` 定位(static除外)的子元素(包括 display:table 和 display:inline ) 6. 拥有 `z-index:0` 的子堆叠上下文元素 7. 拥有正 `z-index:` 的子堆叠上下文元素(正的越低越堆叠层级越低) 所以我们的两个 `div` 的比较是基于上面所列出来的 4 和 5 。5 的 `stacking level` 更高,所以叠得更高。 不过!不过!不过!重点来了,请注意,上面的比较是基于两个 `div` 都没有形成 `堆叠上下文` 这个为基础的。下面我们修改一下题目,给两个 `div` ,增加一个 `opacity`: .container{ position:relative; background:#ddd; } .container > div{ width:200px; height:200px; opacity:0.9; // 注意这里,增加一个 opacity } .float{ float:left; background-color:deeppink; } .inline-block{ display:inline-block; background-color:yellowgreen; margin-left:-100px; } [Demo戳我][Demo]。 会看到,`inline-block` 的 `div` 不再一定叠在 `float` 的 `div` 之上,而是和 HTML 代码中 DOM 的堆放顺序有关,后添加的 div 会 叠在先添加的 div 之上。 这里的关键点在于,添加的 `opacity:0.9` 这个让两个 div 都生成了 `stacking context(堆叠上下文)` 的概念。此时,要对两者进行层叠排列,就需要 z-index ,z-index 越高的层叠层级越高。 堆叠上下文是HTML元素的三维概念,这些HTML元素在一条假想的相对于面向(电脑屏幕的)视窗或者网页的用户的 z 轴上延伸,HTML 元素依据其自身属性按照优先级顺序占用层叠上下文的空间。 **层叠顺序** (层叠次序, 堆叠顺序, Stacking Order) 描述的是元素在同一个层叠上下文中的顺序**规则**,从层叠的底部开始,共有七种层叠顺序,如图: ![1620 2][] 转载于:https://www.cnblogs.com/leftJS/p/11063683.html [CSS2.1]: http://www.w3.org/TR/CSS21/visuren.html#z-index [1620]: https://ask.qcloudimg.com/http-save/yehe-4433349/6qd58hmvsy.png?imageView2/2/w/1620 [1620 1]: https://ask.qcloudimg.com/http-save/yehe-1038478/5ep44kdog3.png?imageView2/2/w/1620 [W3]: https://www.w3.org/TR/CSS2/visuren.html#propdef-z-index [Demo]: http://codepen.io/Chokcoco/pen/qaqdqA [1620 2]: https://ask.qcloudimg.com/http-save/yehe-4433349/cb9o016l6i.jpeg?imageView2/2/w/1620
还没有评论,来说两句吧...