css层叠上下文,层叠等级,层叠顺序

534 阅读2分钟

对z-index片面的理解

之间对z-indx的理解还是非常的片面,就以为它是一个定义元素在z轴上位置的一个因子,但是后来发现并没有那么简单。

首先z-index其实只能在添加了非静态定位的元素(也就是position:!static)上使用,如果元素不是定位元素,那么添加的z-index是无效的。

层叠上下文

说白了,层叠上下文就是有一个元素形成的,因为他的图层升高了,他的子元素们就处在了他的层叠上下文中。层叠上下文是由满足条件的元素组成的:下面是详细条件的链接(developer.mozilla.org/zh-CN/docs/…) 根据这个链接中给出的代码,可以的到如下的结果:

屏幕截图 2021-10-31 161537.png 可以看出Element#4,Element#5,Element#6都是Element#3的子元素,这三个子元素同属于一个层叠上下文,它们进行比较。然后它们和Element#3作为一个整体与Element#3的兄弟元素进行比较。所以可以看出尽管Elment#4的z-index为6,但是他还是在Element#1的下面。

层叠顺序

如果说层叠上下文是一个概念,那么层叠顺序就是一个规则。在不考虑CSS3新属性的情况下,层叠顺序如下所示:

image.png 其中background/border指的是背景和边框;
行内元素的层叠顺序要比块级元素的层叠顺序要高;

<style>
  .box1, .box2 {
    position: relative;
    z-index: auto;
  }
  .child1 {
    width: 200px;
    height: 100px;
    background: #168bf5;
    position: absolute;
    top: 0;
    left: 0;
    z-index: 2;
  }
  .child2 {
    width: 100px;
    height: 200px;
    background: #32c292;
    position: absolute;
    top: 0;
    left: 0;
    z-index: 1;
  }
</style>
</head>

<body>
  <div class="box1">
    <div class="child1"></div>
  </div>

  <div class="box2">
    <div class="child2"></div>
  </div>
</body>

上面的例子虽然这两个box都设置了position,但是它们的z-index都是auto,所以并没有形成自己的层叠上下文,所以它们同时处在html根层叠上下文。那么child的层级就由它们自己的z-index决定了,因为它们都同时具备了position和z-idnex的条件。