美文网首页
《CSS》层叠顺序 与 z-index

《CSS》层叠顺序 与 z-index

作者: BA_凌晨四点 | 来源:发表于2021-03-14 00:35 被阅读0次

    层叠上下文

    之前,我了解到在css中,有“作用域”的存在,块级上下文(BFC),浮动元素产生浮动流。position的absolute和fixed。只要position非static 设置了z-index,则无论在哪里,统一严格按照 z-index 设置的值决定 层级!

    在昨天,做项目的时候发现了一个奇怪的现象。

    div {
      width: 300px;
      height: 300px;
      position: absolute;
      left: 0;
      top: 0;
    }
    .box1 {
      z-index: 10;
      background-color: skyblue;
    }
    .box2 {
      z-index: 9;
    }
    .content {
      z-index: 999;
      background-color: red;
    }
    
    <div class="box1"></div>
    
    <div class="box2">
      <div class="content"></div>
    </div>
    

    三个div,都是脱离了文档流的,则按照我之前的理解,z-index 最大的是 .content,最上方的应该是红色div.content
    可是结果...

    image.png

    查了一下,看到有人说是z-index会在一些情况失效。。。

    我发现事情并非这么简单的失效...

    后来看了一些资料和说法。

    说层叠上下文从后到前的排列是有顺序的:

    就像刷油漆,一层一层的刷:

    1. 创建层叠上下文的元素的背景和边框
    2. 层级 z-index 为负值的层叠上下文
    3. 常规流非定位的块盒
    4. 非定位的浮动盒子
    5. 常规流非定位 行盒(inline 或者 inline-block)
    6. 任何 z-index 是 auto 的定位子元素,以及 z-index 是0的层叠上下文
    7. 层级 z-index 为正值的层叠上下文

    几个特别注意点:

    一:如果同一级的元素,没有设置 z-index(即z-index:auto),则它的儿子们的层级取决于儿子们自己,否则取决于它!!
    二:如果级别完全一模一样,则写在后面的,覆盖前面的
    三:设置了position并且非static,它的 z-index才生效(注意不一定要脱离文档流,position: relative 也行)
    四:每个成功生效的z-index的元素,在它的身上,创建一个新的 层叠上下文
    五:如果该元素设置了属性transform的属性,则它的儿子们永远无法逃离出去了。。
    <div class="father">
      <div class="son"></div>
    </div>
    
    <div class="mother">
      <div class="daughter"></div>
    </div>
    
    .father {
      transform: translate(1px, 1px);
    }
    .son {
      ...
      z-index: 999999
    }
    

    依然无法覆盖<div class="mother">
    但是相反,在<div class="mother">设置transform<div class="daughter>却能覆盖<div class="father">,因为后者能覆盖前者


    回到我之前的问题:

    为什么最上方的不是 z-index 最大的红色.content?

    因为:它的父亲.box2和天蓝色div.box1是同一级,而父亲div.box1它自己设置了z-index而且还要比别人低。。。,导致无论儿子们的层级有多高,都盖不过别人家。。

    如果父亲div.box1没有设置z-index,则盖到最上层的就是红色.content

    还有一个稍复杂的场景

    <div class="grandFather">
      <div class="father">
        <div class="son">小明</div>
      </div>
    </div>
    
    <div class="grandMother">
      <div class="mother">
        <div class="daughter">翠翠</div>
      </div>
    </div>
    
    .father {
      ...  // 设置宽高、定位
      z-index: 99;
    }
    .son {
      ...// 设置宽高、定位
     z-index: 999
    }
    
    .mother {
     ... //设置宽高、定位
     z-index: auto;
    }
    .daughter {
      ... // 设置宽高、定位
      z-index: 9999999;
    }
    

    这种情况,.son 依然会在.daughter上方,
    因为,在他们的父一辈,.father层级比.mother
    无论.son再努力,也无法盖过 比他父辈大的层级。

    相关文章

      网友评论

          本文标题:《CSS》层叠顺序 与 z-index

          本文链接:https://www.haomeiwen.com/subject/liaxcltx.html