当宽度设置为 inner-div 时,Z-Index 不适用于 border-right

Z-Index does not apply to border-right when width set on inner-div

这让我很困惑。我将 border-rightborder-leftborder-bottom 应用于 div,其中有另一个绿色 BG 颜色 div。我在带有边框的父 div 上设置了 z-index: 1position: relative

但是,正如您在照片中看到的,只有左边框应用了 z-index,而右边框没有应用 z-index 并且落后于绿色 div .

只有当我在 inner-div 上设置的宽度比外部 div 宽时才会发生这种情况,而且它似乎只是防止第一个右边界出现在 bg 之上,作为重复元素不会遇到这个问题。

这没有任何意义,并且在 Chrome、Firefox 和 Edge 中是一致的。

这是我刚刚发现的 CSS 的一些奇怪的怪癖/错误吗?还是我完全搞砸了?

.flex-div {
  display: flex;
}

.outer-div {
    position: relative;
    border-right: 7px solid #cccccc;
    border-bottom: 1px solid #cccccc;
    border-left: 7px solid #cccccc;
    z-index: 1;
    max-width: 200px;
    flex: 0 0 200px;
}

.mid-div {
  width: 600px;
  z-index: -1;
  position: relative;
}

.inner-div {
    background-color: #00b989;
    width: 250px;
    height: 50px;
    display: inline-block;
    z-index: -1;
    position: relative;

}
<div class="flex-div"> 
  <div class="outer-div"> outer
    <div class="mid-div"> 
      <div class="inner-div">inner</div>
      <div class="inner-div">inner</div>
    </div>  
  </div>
  <div class="outer-div"> outer  </div>
  <div class="outer-div"> outer  </div>
<div>

你能帮我诊断一下发生这种情况的原因,以及让 outer-div 左右两侧的边框覆盖 -inner-div 的任何解决方法吗?

您无法控制与其 children 相关的 z-index,因为它们包含在内(某种意义上)继承了 z-index .

但是您可以通过将 z-index 设置为 -1 来使 children 落后于他们的 parent。

.outer-div {
    position: relative;
    flex: 0 0 200px;
    border: 7px solid #cccccc;
    max-width: 200px;
}

.inner-div {
    background-color: #00b989;
    width: 250px;
    height: 50px;
    position:relative;
    z-index:-1;
}
<div class="outer-div"> outer
    <div class="inner-div">inner</div>
  </div>


或者您可以在 parent 上应用 overflow:hidden,以便在较大时隐藏绿色条(如果满足您的需要

.outer-div {
    flex: 0 0 200px;
    border: 7px solid #cccccc;
    max-width: 200px;
    overflow:hidden;
}

.inner-div {
    background-color: #00b989;
    width: 250px;
    height: 50px;
}
<div class="outer-div"> outer
    <div class="inner-div">inner</div>
  </div>

要解决您的问题,您需要将 z-index 应用于子元素而不是父元素(让父元素保持 z-index auto)

顶部所有边框:

.flex-div {
  display: flex;
}

.outer-div {
    border-right: 7px solid #cccccc;
    border-bottom: 1px solid #cccccc;
    border-left: 7px solid #cccccc;
    max-width: 200px;
    flex: 0 0 200px;
}

.mid-div {
  width: 600px;
  z-index: -1;
  position: relative;
}

.inner-div {
    background-color: #00b989;
    width: 250px;
    height: 50px;
    display: inline-block;
    z-index: -1;
    position: relative;

}
<div class="flex-div"> 
  <div class="outer-div"> outer
    <div class="mid-div"> 
      <div class="inner-div">inner</div>
      <div class="inner-div">inner</div>
    </div>  
  </div>
  <div class="outer-div"> outer  </div>
  <div class="outer-div"> outer  </div>
<div>

底部全部边框

.flex-div {
  display: flex;
}

.outer-div {
    border-right: 7px solid #cccccc;
    border-bottom: 1px solid #cccccc;
    border-left: 7px solid #cccccc;
    max-width: 200px;
    flex: 0 0 200px;
}

.mid-div {
  width: 600px;
  z-index: 1;
  position: relative;
}

.inner-div {
    background-color: #00b989;
    width: 250px;
    height: 50px;
    display: inline-block;
    z-index: -1;
    position: relative;

}
<div class="flex-div"> 
  <div class="outer-div"> outer
    <div class="mid-div"> 
      <div class="inner-div">inner</div>
      <div class="inner-div">inner</div>
    </div>  
  </div>
  <div class="outer-div"> outer  </div>
  <div class="outer-div"> outer  </div>
<div>


要了解您的初始问题,您需要考虑绘画顺序和堆叠上下文。通过将 z-index 应用于父元素,您可以创建一个堆叠上下文,并且由于它们都具有相同的 z-index ,因此它们将根据树顺序进行绘制。因此,我们打印第一个元素及其所有内容,然后打印第二个元素及其所有内容,依此类推。

按照这个逻辑,你会看到第一个元素的左边框和右边框会因为内容溢出而被隐藏,然后你会看到第二个元素的左边框位于所有先前内容的顶部等等。

下面是一个基本示例,可以更好地说明您的问题:

.box {
 border-left:10px solid red;
 border-right:10px solid red;
 height:50px;
 width:100px;
 display:inline-block;
 vertical-align:top;
 position:relative;
 z-index:1;
}
.box > div {
  width:130%;
  height:60%;
  background:blue;
}
<div class="box">
  <div></div>
</div><div class="box" style="margin-top:20px;">
  <div></div>
</div><div class="box" style="margin-top:30px;">
  <div></div>
</div>

为父元素添加了一些偏移量,以便您可以清楚地识别绘制顺序。

现在,如果您将正 z-index 设置为仅子元素,它们将全部绘制在所有父元素的顶部。

.box {
 border-left:10px solid red;
 border-right:10px solid red;
 height:50px;
 width:100px;
 display:inline-block;
 vertical-align:top;
}
.box > div {
  width:130%;
  height:60%;
  background:blue;
 position:relative;
 z-index:1;
}
<div class="box">
  <div></div>
</div><div class="box" style="margin-top:20px;">
  <div></div>
</div><div class="box" style="margin-top:30px;">
  <div></div>
</div>

如果你应用负 z-index 它们都会被涂在后面:

.box {
 border-left:10px solid red;
 border-right:10px solid red;
 height:50px;
 width:100px;
 display:inline-block;
 vertical-align:top;
}
.box > div {
  width:130%;
  height:60%;
  background:blue;
 position:relative;
 z-index:-1;
}
<div class="box">
  <div></div>
</div><div class="box" style="margin-top:20px;">
  <div></div>
</div><div class="box" style="margin-top:30px;">
  <div></div>
</div>

将任何 z-index 值应用于父元素将使您无法实现您想要的,因为子元素将被困在其父元素的堆栈上下文中。


有关更多详细信息的相关问题: