如何在三级层次结构中使用 z-index 定位元素进行布局

How to lay out with z-index positioned elements in a third level hierarchy

我对 z-index 属性 有疑问。我有一些绝对定位的元素(代码中的div)一个在彼此内部。里面的第一个 div(红色 div)自然会在它的父元素(aliceblue 元素)前面,因此我给里面的红色 div 一个负的 z-index 就可以了。但是 aqua div(在红色 div 里面)也在红色元素的前面(相反我会把 aqua 元素放在红色元素后面),为了把它放在后面我给它 z-index:-5 例如,但它不起作用,因为我创建了一个新的堆叠上下文,不同于其父亲的堆叠上下文

         div {
            width: 300px;
            height: 300px;
            text-align: center;
            position: absolute;
         }
         .a {
            background-color: aliceblue;
            position: relative;
         }
         .a1 {
            background-color: red;
            left: 20px;
            top: 20px;
            z-index: -1;
         }
         .a11 {
            background-color: aqua;
            left: 10px;
            top: 10px;
            /* z-index: -5; This doesn't work*/
         }

         .a2 {
            background-color: yellow;
            top: 40px;
            z-index: -2;
         }
  
      <div class="a">
         A
         <div class="a1">
            A1
            <div class="a11">A11</div>
         </div>
         <div class="a2">A2</div>
      </div>
  

到目前为止,我们还没有找到使用 z-index 执行此操作的方法。

以下方法可能适合也可能不适合您的特定用途case/overall上下文,但它确实解决了问题中给出的代码的问题。

此代码段使用 3d 变换而不是 z-index 来定位与正注视屏幕的观看者相关的元素。

当然,我们实际上并不想引入可感知的视角,因此该片段使用了一个小的向后移动 (0.1px)。这似乎足以让系统按要求的顺序将元素放置在彼此之上,但忽略了小部分(至少在我的 Windows10 Edge 上)。

div {
  width: 300px;
  height: 300px;
  text-align: center;
  position: absolute;
  transform-style: preserve-3d;
}

.a {
  background-color: aliceblue;
  position: relative;
  transform: translate3d(0, 0, 0);
}

.a1 {
  background-color: red;
  left: 20px;
  top: 20px;
  transform: translate3d(0, 0, -0.1px);
}

.a11 {
  background-color: aqua;
  left: 10px;
  top: 10px;
  transform: translate3d(0, 0, -0.2px);
}

.a2 {
  background-color: yellow;
  top: 40px;
  transform: translate3d(0, 0, -0.4px);
}
<div class="a">
  A
  <div class="a1">
    A1
    <div class="a11">A11</div>
  </div>
  <div class="a2">A2</div>
</div>