从头学前端-33:层叠上下文和层叠水平

557 阅读4分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

大家好,我是一碗周,一个不想被喝(内卷)的前端。如果写的文章有幸可以得到你的青睐,万分有幸~

这是【从头学前端】系列文章的第三十三篇-《盒子模型》

本系列文章在掘金首发,编写不易转载请获得允许

写在前面

本篇文章将来学习层叠上下文和层叠水平,在学习这两个内容之前我们先来学习一下z-index属性。

z-index属性

CSS中提供的z-index属性指定了一个定位元素以及子元素在z轴的顺序。当元素之间有重叠的时候,z-index属性决定哪一个元素覆盖在其余元素的上方显示。通常来说z-index较大的元素会覆盖较小的一个元素。

z-index的属性值有两个,一个是整型数字,表示堆叠层级,还有一个值为auto表示不会创建新的堆叠上下文。

示例代码如下所示:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible"
        content="IE=edge">
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0">
  <title>z-index属性</title>
  <style>
    body {
      margin: 0;
      padding: 20px;
    }

    .container {
      position: absolute;
      background-color: #fffae8;
    }

    .container1 {
      z-index: 1;
      background-color: lightcoral;
    }

    /* container2 的层级大于 container1 */
    .container2 {
      z-index: 2;
      left: 120px;
      background-color: blueviolet;
    }


    .item {
      position: relative;
      height: 200px;
      width: 200px;
      line-height: 200px;
      text-align: center;
      font-size: 80px;
    }

    /* container1 子级的层级再大,也不会覆盖 container2 子级 */
    .item1 {
      z-index: 999;
      background-color: #e6005c;
    }

    .item2 {
      z-index: 1;
      background-color: #777bce;
    }
  </style>
</head>

<body>
  <div class="container container1">
    <div class="item item1">1</div>
  </div>
  <div class="container container2">
    <div class="item item2">2</div>
  </div>
</body>

</html>

代码运行结果如下所示:

01_z-index属性.png

根据祖先的z-index值来决定谁在上面,如果祖先本身的z-index的值没有其他元素祖先本身的z-index值大,子元素z-index的值就算再大也没有作用。

动态获取页面最大的z-index的值

代码如下:

function getMaxZIndex(){
  let arr = [...document.all].map(e => +window.getComputedStyle(e).zIndex || 0);
  return arr.length ? Math.max(...arr) + 1 : 0
}

值得注意的是,这个函数需要在 DOM 元素渲染完毕执行。

层叠上下文

层叠上下文是 HTML 元素中的一个三维概念,表示元素在一条虚构的z轴上的排开。众HTML元素基于其元素属性按照优先级顺序占据这个空间。

以下几个方式具有层叠上下文

  • 页面根元素天生具有层叠上下文,称之为根层叠上下文
  • z-index值为数值的定位元素也具有层叠上下文
  • position属性且值不为static ,且z-index值不为auto的元素
  • flex容器的子元素,且z-index值不为auto
  • grid 容器的子元素,且 z-index 值不为auto
  • opacity属性值小于1的元素
  • transform属性值不为none的元素
  • filter属性值不为none的元素
  • isolation属性值为isolate的元素
  • -webkit-overflow-scrolling属性值为touch的元素;
  • 等等

堆叠上下文具有如下特性:

  • 层叠上下文可以嵌套,组合成一个分层次的层叠上下文。
  • 每个层叠上下文和兄弟元素独立: 当进行层叠变化或渲染的时候,只需要考虑后代元素。
  • 每个层叠上下文是自成体系的: 当元素的内容被层叠后,整个元素被认为是在父层的层叠顺序中。

层叠水平

层叠上下文中的每一个元素都有一个层叠水平,决定了同一个层叠上下文中元素在z轴 上的显示顺序。其遵循当CSS样式没有太大差别的时候,哪个元素在后面哪个元素就在上面的准则。

简单来说,所谓的层叠水平就是在 层叠上下文 中,元素的z轴排列顺序。

值得注意的是层叠水平和z-index并不是一个东西。普通元素也具有层叠水平。

特性如下:

  • 层叠上下文可以嵌套,组合成一个分层次的层叠上下文。
  • 每个层叠上下文和兄弟元素独立: 当进行层叠变化或渲染的时候,只需要考虑后代元素。
  • 每个层叠上下文是自成体系的: 当元素的内容被层叠后,整个元素被认为是在父层的层叠顺序中。

层叠顺序

层叠顺序表示元素发生才层叠时候有着特定的垂直显示循序,HTML中的层叠水平如下图所示:

seven_stacking_level.png

其意义是规范元素重叠时的规范

注:只要具有层叠上下文就会遵循层叠顺序

写在最后

你如果看到这里,我感到很荣幸,如果你喜欢这篇文章,你可以为这篇文章点上一个小赞;你如果喜欢这个专栏,我会一直更新到百篇以上,可以点一下后面的链接从头学前端 - 一碗周的专栏 - 掘金 (juejin.cn)进入之后给个关注。

最后也可以给我点个关注,万分荣庆。

往期推荐