在我开始解释之前,让我注意z-index 仅在元素的 rendered 值为 position:relative、position:absolute 或 position:fixed(而不是 static ) 因为每一个都使它有自己的stacking context。这意味着像 initial 或 inherit 这样的值可能会或可能不会工作,具体取决于具体情况。
另外请注意,在这篇文章中,我将使用格式 1.1.1 来表示我正在选择第一个元素的第一个子元素的第一个子元素。 2.1.1 将是第二个元素的第一个孩子的第一个孩子,依此类推。
我认为z-index 最好通过使用子列表进行类比来解释。让我们从最简单的例子开始:
<div class="top-level"></div>
<div class="top-level sibling"></div>
我们可以用这样的列表来表示:
- 顶级
- 顶级同级
现在默认情况下,列表下方的那些将呈现在它之前的顶部。所以在这种情况下,2 将位于 1 之上。
z-index 允许我们做的基本上是重新排序这个列表(在一定范围内)。 z-index 越高,我们的元素在列表中越靠后。
我将在这里使用内联 CSS 来简化显示,但您应该绝对避免在生产代码中使用内联 CSS。
<div class="top-level" style="z-index: 1;"></div>
<div class="top-level sibling"></div>
这现在将我们的子列表更改为如下所示:
- 顶级同级
- 顶级 - z-index:1
太棒了!现在我们的 HTML 中的第一个元素将呈现在我们的第二个元素之上。
当我们处理子(嵌套)元素时,这变得更加棘手。
考虑这种情况的一种更简单的方法是认为当一个元素开始被渲染时,它会在移动到任何兄弟元素之前渲染该元素的所有子元素。
还请记住,子列表不能更改级别,这意味着它们不能与父元素或子元素处于同一级别。
这意味着如果我们有以下内容:
<div class="top-level">
<div class="sub-level" style="z-index: 1;"></div>
</div>
<div class="top-level sibling"></div>
我们的渲染子列表如下所示:
- 顶层
- 子级别 - z-index1
- 顶级同级
因此,我们查看顶层并查看列表底部的哪一个。在这种情况下,2.0 是,所以它将在 1.0 之上。然后我们查看它是否有任何子列表(子列表)。它没有,所以我们转到 1.0。
1.0 有一个子 1.1,它在视觉上会高于 1.0(就像我们没有给它一个 z-index 一样),但它仍然会低于 2.0,因为 1.0 低于 2.0。
因此这里的 z-index 对我们没有帮助,因为 1.1 没有任何兄弟姐妹。
让我们举一个稍微复杂一点的例子:
<div class="top-level">
<div class="sub-level" style="z-index: 2;"></div>
<div class="sub-level sibling"></div>
<div class="sub-level sibling" style="z-index: 1;"></div>
</div>
<div class="top-level sibling">
<div class="sub-level"></div>
</div>
此示例的子列表是什么?
我会给你的,不过你自己试试做也不错。
- 顶层
- 子级兄弟
- 子级同级 - z-index1
- 子级别 - z-index2
- 顶级同级
- 子级别
因此,就视觉上从上到下的顺序而言,顺序为 2.1、2.0、1.3、1.2。 1.1、1.0。
还不错吧?
无论有多深或有多少兄弟姐妹,这种行为都是正确的。
将子级呈现在父级之上的规则的唯一例外是子级具有否定的z-index。当给出负 z-index 时,它会将自身置于父元素之下。
因此,如果我们有以下内容:
<div class="top-level">
<div class="sub-level" style="z-index: -1;"></div>
</div>
<div class="top-level sibling"></div>
子列表树如下所示:
- 子级别 - z-index-1
- 顶级
- 顶级同级
而从上到下的分层是 2.0、1.0、1.1。
一个稍微复杂一点的例子:
<div class="top-level">
<div class="sub-level" style="z-index: -1;"></div>
<div class="sub-level sibling"></div>
</div>
<div class="top-level sibling"></div>
列表表示:
- 子级别 - z-index-1
- 顶层
- 子级别
- 顶级同级
但您应该避免否定z-indexes。如果您认为需要它们,则很可能是您的 HTML 结构不正确。
就是这样!如果您仍然有兴趣了解更多信息,阅读the specs 总是不错的。
请记住,other properties,包括但不限于opacity、transform 和will-change,会创建自己的堆叠上下文,并且可能会影响元素的呈现顺序。
opacity 的工作方式类似于 z-index - 子级只能与其父级一样不透明 - 但不能有负值。