z-index到底是什么?

714 阅读2分钟

最初,我对z-index的理解只是元素设置position不为staic,设置了z-index,z-index后面的数值约大,元素在z轴上的位置越靠上;但并没有这么简单,比如,如何解释这种现象?

有两个div,p.a、p.b被包裹在一个div里,p.c被包裹在另一个盒子里,同时为两个div和.a、.b、.c设置positionz-index属性

    <style>
      div {
        width: 200px;
        height: 200px;
        position: relative;
      }
      .box1 {
        z-index: 2;
      }
      .box2 {
        z-index: 1;
      }
      p {
        position: absolute;
        font-size: 20px;
        width: 200px;
        height: 200px;
      }
      .a {
        background-color: lightblue;
        z-index: 100;
      }
      .b {
        background-color: lightgreen;
        top: 40px;
        left: 50px;
        z-index: 200;
      }
      .c {
        box-sizing: border-box;
        padding-top: 100px;
        background-color: pink;
        top: -40px;
        left: 20px;
        z-index: 9999;
      }
    </style>

    <body>
      <div class="box1">
        <p class="a">z-index: 100;</p>
        <p class="b">z-index: 200;</p>
      </div>

      <div class="box2">
        <p class="c">z-index: 9999;</p>
      </div>
    </body>

image.png
为何效z-index最大的9999 不是在最上层,反而在最下层呢? 实际上,判断元素在Z轴上的堆叠顺序,不仅仅是直接比较两个元素的z-index值的大小,堆叠顺序实际由元素的层叠上下文层叠等级共同决定。

什么是层叠上下文?

元素提升为一个比较特殊的图层,在三维空间中  (z轴)  高出普通元素一等。最终表现就是它离屏幕观察者更近。

层叠上下文受哪些因素影响?

  • 根层叠上下文(html)

  • positionposition属性为static值并设置z-index属性为具体数值)

  • css3属性

    • flex
    • transform
    • opacity
    • filter
    • will-change
    • -webkit-overflow-scrolling

什么是层叠等级

即元素在z轴上的上下顺序,在同一层叠上下文中,当元素发生层叠时,层叠顺序遵循下面的规则

image.png

重点来了:

  • 只有在同一层叠上下文中,层叠等级才有意义;

在不同层叠上下文中,如何判断哪个元素在上面?

先比较他们所处的层叠上下文的层叠等级, 当他们所处的层叠上下文的层叠等级时,在DOM结构中后面的元素层叠等级在前面元素之上。