【堆叠上下文】

堆叠上下文

mdn文档 - 堆叠上下文

浏览器坐标轴

浏览器中: 水平为 X 轴 , 垂直向下为为 Y 轴 , 而 Z 轴则是垂直于屏幕 .





什么是堆叠上下文?

堆叠上下文(stack context),它是一块区域,这块区域由某个元素创建,它规定了该区域中的内容在 z 轴上的排列的先后顺序 .

通常可以通过设置 z-index 来控制元素在z轴的排列顺序 .





z-index 排列规则

mdn文档 - z-index

设置 z-index 通常情况下,该值越大,越靠近用户 .

z-index 可以是负数,如果是负数,则遇到常规流,浮动元素,则会被其覆盖 .


一. 创建堆叠上下文的元素

  • html元素(根元素)
  • absolute 绝对定位和 relative 相对定位,且设置了 z-index 且值非 auto 数值的定位元素
  • fixed 固定定位和 sticky 粘性定位
  • flex 容器的子元素,且设置了 z-index 且值不为 auto
  • grid 容器的子元素,且设置了 z-index 且值不为 auto
  • transform filter background-filter perspective clip-path 等

二. 同一个堆叠上下文中元素在 z 轴上的排列

从后到前依次排列顺序:

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

每个堆叠上下文,独立于其他堆叠上下文,它们不能相互穿插



示例

普通元素设置 z-index 不会生效

<head> 
	<style>
        .container {
            width: 300px;
            height: 300px;
            background-color: violet;
            z-index: 10;
        }
    </style>
</head>

<body>
    <div class="container"></div>
</body>


结果

z-index 不生效





产生堆叠上下文的元素生效

这里使用 flex 产生堆叠上下文 , 不过你需要注意 , 文档规定是 flex 的子元素才可以使用 z-index .

flex 创建堆叠上下文, 它的子元素通过设置 z-index 来决定在这个堆叠上下文中z轴的排列顺序 .

<head>
    <style>
        .container {
            display: flex;
            width: 300px;
            height: 300px;
            background-color: violet;
        }

        .child {
            z-index: 10;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="child"></div>
    </div>
</body>

结果

z-index 生效





总结

一般我们设置 z-index 都是在定位元素上设置的 , 通常的做法是给元素加上 position: reactive; 然后设置 z-index .

注意点: z-index 规定的是元素在当前这个堆叠上下文中的z轴排列顺序 . 而不是整个文档中z轴的顺序 .



示例

<head>
    <style>
        .container1 {
            position: relative;
            z-index: 10; /* 设置层级 */
        }

        .container1 .a {
            position: absolute;
            z-index: 1; /* 设置层级 */
            width: 300px;
            height: 300px;
            background-color: violet;
        }

        /* container2 */
        .container2 {
            position: relative;
            z-index: 9; /* 设置层级 */
        }

        .container2 .b {
            position: absolute;
            left: 150px;
            z-index: 1000; /* 设置层级 */
            width: 300px;
            height: 300px;
            background-color: lightblue;
        }
    </style>
</head>

<body>
	<div class="container1">
        <div class="a">container1</div>
    </div>
    <div class="container2">
        <div class="b">container2</div>
    </div>
</body>

结果


可以看到结果是 container1 中 a 的层级高于 container2 中的 b .

a 设置的 z-index 是 1, 而 b 设置的 z-index 是 1000 .


为什么 a 的层级反而高于 b ?

是因为 z-index 设置的是在当前堆叠上下文的排列顺序 .

container1 的 z-index 是 10 , 而 container2 的 z-index 是 9 .

container1 中的元素天然的就高于 container2 .


还是那句话

z-index 规定的是元素在当前这个堆叠上下文中的z轴排列顺序 . 而不是整个文档中z轴的顺序 .

堆叠上下文 . 这个层级问题开发中使用定位时会经常会出现 .

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值