代码之家  ›  专栏  ›  技术社区  ›  norixxx

当父内容将图像作为子内容,并且其他元素具有不透明度时,CSS堆栈顺序会发生变化

  •  1
  • norixxx  · 技术社区  · 7 年前

    在编写css时,我发现了一些奇怪的行为,特别是使用负边距将元素堆叠在其他元素上。

    我理解自然的堆叠顺序,即当元素重叠时,后面的元素总是位于顶部(不使用相对、绝对定位)。

    问题1:为什么前一个元素有图像元素,后一个元素在图像下?

    问题2:此外,当后一个元素的不透明度不是1时,后一个元素超过前一个元素(回到自然顺序?)

    HTML:

    <div class="box sample1">
            <img src="http://fillmurray.com/100/100" alt="">
    </div>
    <div class="box sample1-2">opacity: 1</div>
    
    
    <div class="box sample1-3">
        <img src="http://fillmurray.com/100/100" alt="">
    </div>
    <div class="box sample1-4">opacity: .9</div>
    

    SCS:

    .box {
        width: 100px;
        height: 100px;
    }
    .child {
        width: 80px;
        height: 80px;
    }
    .sample1 {
        background-color: yellow;
        width: 300px !important;
    }
    .sample1-2 {
        background-color: red;
        margin-top: -40px;
    
        .child {
            // background-color: green;
        }
    }
    
    .sample1-3 {
        // opacity: .9;
        width: 300px;
        background-color: green;
    }
    .sample1-4 {
        opacity: .9; //this changes stack order
        background-color: red;
        margin-top: -40px;
    }
    

    演示: https://jsfiddle.net/nori2tae/4w62t746/8/

    需要一些解释,谢谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Danield    7 年前

    问题1:为什么前一个元素有图像元素,后一个元素会消失 在图像下?

    这是因为在相同的堆叠上下文中,内联级元素(如图像)绘制在非内联级元素的上方(请参见 this post )

    This article 有一个很好的图像来总结相同堆叠上下文中元素的堆叠顺序:

    enter image description here

    问题2:此外,当后一个元素的不透明度不是1时, 后一个元素超越前一个元素(回到自然顺序?)

    这是因为在不透明度值小于1的元素上形成了新的堆叠上下文。

    从…起 the spec :(粗体)

    如果定位了不透明度小于1的元素,则z索引 属性适用于[CSS21]中所述的情况,但-auto是 被视为–0–0 因为总是创建新的堆叠上下文 .

    查看全部 this MDN article 关于堆叠上下文。