通常,当我看到“绘制顺序”或“堆叠上下文”之类的术语时,我的大脑会开始关闭,我的眼睛会变得模糊。并不是说我的大脑通常不会比平时更多地关闭,但那是另一个主题,留待以后再谈。
Igalia 的 Martin Robinson 在他的 博文中讨论了这些概念,他使用了一个非常容易理解的例子,即使对我来说也是如此。他从两个带有负边距的重叠框开始。
<div class="blue box">1</div>
<div class="green box">2</div>

然后,他介绍了一个作为绿色框子元素的第三个框。绿色框的 z-index
设置为 -1。正如您预期的那样,绿色和黄色框都堆叠在蓝色框下方。
<div class="blue box">0</div>
<div class="green box" style="position: relative; z-index: -1;">-1
<div class="yellow box">-1</div>
</div>

这就是我的大脑开始融化的地方。如果绿色框的 z-index
保持不变,为 -1,但我们给它的子元素一个巨大的值,比如 1000,情况看起来……完全一样。
<div class="blue box">0</div>
<div class="green box" style="position: relative; z-index: -1;">-1
<div class="yellow box" style="position: relative; z-index: 1000;">1000</div>
</div>

我相信你们中的许多人已经猜到(或者干脆知道)为什么蓝色框仍然在最上面,即使更改黄色框的 z-index
意味着它应该在最上面,但我肯定没有。Martin 在 CSS2 规范 的深处,附录 E 中找到了技术答案,他慷慨地链接了它——否则,我相信我永远找不到它。
我们从附录 E 中了解到,堆叠上下文是页面元素的原子绘制集合。这意味着什么?简单地说,这意味着堆叠上下文中的元素作为一个单元一起绘制,而堆叠上下文外部的元素永远不会绘制在它们之间。拥有一个活动的
z-index
是 CSS 中触发堆叠上下文创建的情况之一。有没有办法调整上面的示例,以便第三个元素属于与前两个元素相同的堆叠上下文?答案是,我们必须将其从第二个元素创建的堆叠上下文中移除。
所以,是的。只要黄色框是绿色框的子元素,这两个框就会形成一个堆叠上下文,蓝色框不属于该上下文。要使黄色在蓝色上面,需要将其从绿色的堆叠上下文中移除。

这就是 Martin 文章的核心内容,但他深入探讨了这个问题,值得一读。如果您读了这篇文章,您将看到堆叠顺序是如何导致一些真正的 CSS 技巧的。

这不是我们第一次链接证明 z-index
不是一个公平的竞争环境,所以我要尝试记住这一点,以便在下次(不可避免地)与堆叠元素作斗争时使用它。
我是一个编码新手,正在努力学习所有我能学到的东西,这对我目前正在做的事情很有帮助,谢谢。
非常好的文章。我不得不查看原文才能真正理解到底是怎么回事,因为没有代码,事情很难理解。
事后看来,如果在同一个 div(或任何 CTN)中有两个元素,而内部元素定义了某个 z-index,那么该包装器内部每个元素的 z-index 基本上只在包装器内起作用(上面提到的 div)。
但是,这些场景最好用一些代码来解释,否则它们会很难理解。
感谢您的有见地的文章!
很有帮助
但是如果子元素有 position:absolute; 我想它应该在上面?
是的,这就是为什么我们需要一个真正的绝对索引,因为当前的索引是相对的,它不涵盖所有情况。您经常只需要一个绝对的 zindex。
A – 1
B – 0
B.C – 1000
所以 B.C 会始终处于最上面。目前,您需要操作 DOM,但您并不总是能做到这一点,尤其是在现代数据驱动的框架中。
我建议使用“absolute-z-index”属性
那么
z-index
相对于堆叠上下文吗?如果我理解正确,这就是我的 TLDR;。