CSS样式里面的堆叠(层叠)上下文(层次顺序z-index)

看了网上很多的博客,将了关于这个层叠上下本的技术博客,
然后我也自己去整理了下,我这篇关css元素的堆叠顺序
写的很清楚,很有条理,很简单明了,层叠上下文的法则都总结好了,希望对大家有帮助
这个属于扩展,当然你想了解技术的话,可以看看我这个关于堆叠顺序的理解!
不了解的话,当然有更加简单方法是完成堆叠上下本的方法!

当然这是我自然的理解,有说的不对的地方,希望你们可以指出来!大家一起交流学习,一起进步

堆叠上下文

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

创建堆叠上下文的元素

1. html元素(根元素)
2. 设置了z-index数值的定位元素(非auto)
3. 一定是定位元素,也就是需要你去设置这个position属性
4. 当然你也可以去mdn官方文档查看 层叠上下本 哪些元素可以去创建上下本

单个层叠上下本规则

## 同一个堆叠上下文中元素在Z轴上的排
从后到前的排列顺序,也就是出现靠底层
显示层次顺序
1. 创建堆叠上下文的元素的背景跟边框
2. 堆叠级别(z-index)为负值的堆叠上下文
3. 常规流非定位的块盒
4. 非定位的浮动盒子
5. 常规流非定位行盒
6. 任何 z-index 是 auto 的定位子元素
7. 堆叠级别为正值的堆叠上下文

---->>>每个堆叠上下文,独立于其他的堆叠上下文,它们之间不能相互穿插。
你可以理解就是 把每个元素创建的堆叠上下文 看成一个整体。

接下来看下单个层叠上下文的例子

在这里插入图片描述
你可以通过调整每个盒子的margin-top属性的值,依次完成或者去理清楚这个覆盖的情况

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>单个堆叠上下本</title>
    <style>

        /* 第1个级别   背景跟边框 */
        html{
            /* 本身html也会创建堆叠上下文 */
            background: lightblue;
        }

        /* 第6个级别  就是z-index 为默认值 auto 或者为0  
            很显然 这个效果是在最前面的 
        */
        .container{
            background: #008c8c;
            width: 200px;
            height: 200px;
            position: relative;
            /* 创建堆叠上下文 */
            /* z-index: -1; */
            /* 要是这个z-index是auto的话,这个div就不会创建堆叠上下文 */
            margin: 50px;
        }

        /* 第2个级别  就是z-index为负数 */
        .item{
            width: 100px;
            height: 100px;
            background: red;
            position: relative;
            z-index: -1;
            /* z-index: 设置的值为多少,都是无法在父元素的下面 */
            float: left;
            left: -30px;
            top: -30px;
        }
        /* 第3个级别   常规流非定位块盒 */
        .nomal{
            /* 通过浏览器F12去修改margin-top值 动态修改,可以看到效果*/
            width: 200px;
            height: 200px;
            background: chocolate;
            margin-top: -200px;
        }

        /* 第4个级别   非定位浮动盒子 */
        .float{
            width: 200px;
            height: 300px;
            background: brown;
            margin-top: -390px;
            /* 这个效果最佳 */
            float: left;
            margin-left: 40px;
        }
        /* 第5个级别   常规流非定位行盒 */
        /* 需要注意的就是我们可以看到这个 级别四已经 */
        span{
            background: lightyellow;
            
        }

        /* 第7个级别   很显然  把堆叠级别z-index设置为正值的堆叠上下文, 显然出现在最上面
        
            前提条件就是这个  这个元素会形成堆叠上下文, 不然你去设置堆叠上下文是没有效果的
        */

    </style>
</head>
<body>

    <!-- 第三个 + 第五个级别-->
    <!--因为p元素是常规流非定位块盒 第三个级别  然后 
    这些文字其实是写在span里面的  也是就 常规流非定位行盒
    最后效果也就是很明显,为什么 级别四的背景覆盖了级别三<p>元素的背景
    但是没有覆盖这个 文字的颜色 就是因为文字隐式默认装在<span>里面  (匿名行盒)
    
    以上的解释也就是很清楚解释网页呈现的效果了
    -->
    <p style="background: lightyellow;">
        Lorem ipsum dolor sit amet consectetur, adipisic
    </p>
    <!-- 第五个级别 -->
    <span style="background: lightyellow;">
        Lorem ipsum dolor sit amet consectetur, adipisicing elit. Delectus, illo?
    </span>
    <div class="container">
        <div class="item">

        </div>
    </div>

    <div class="nomal">
        <!-- 常规流盒子非定位 -->
    </div>

    <div class="float">
        <!-- 非定位浮动盒 -->
    </div>
</body>
</html>

多个层叠上下文

在这里插入图片描述

代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        html{
            background: lightblue;

        }
        .c1{
            position: relative;
            z-index: 0;
            background: #008c8c;
            width: 200px;
            height: 200px;

        }
        .c2{
            position: absolute;
            width: 200px;
            height: 200px;
            z-index: -1;
            background:chocolate;
            left: 100px;
            top: 100px;
        }
        .item1,.item2{
            position: absolute;
            height: 100px;
            width: 100px;
        }
        .item1{
            right: -50px;
            bottom: -50px;
        }
    </style>
</head>
<body>
    
        <!-- c1 c2 盒子都会形成堆叠上下本  它们都是在html根元素里面进行层叠 
        所以先把它们两看成两个整体,它们内部的子元素所形成的上下文 暂时不看
        c2的盒子z-index为负,比c1更靠前!根据
        -->

        <!-- 第二个问题
        
        凭什么c1的item1中的红色可以去覆盖这个c2的红色
        规则就是要看整体,你看第一个红色是在c1上下文里面
        第二个红色在c2形成的层叠上下文里面
        所以他们子元素都是以整体来说的,你可以认为他们不可分割
        这样子就能去解释为什么c1红色去覆盖c2红色了!
        -->

        <!-- 第三个问题
            假设我设置item2,让它也形成一个上下文,
            那么item1与item2它们之间的顺序如何
            其实它们两都在c1形成的层叠上下文里面,
            所以它们两根据单独的堆叠上下本就可以分辨
         -->
        <div class="c1">
            <div class="item1 " style="background: red;">红色</div>
            <div class="item2"></div>
        </div>
        
        <div class="c2">
            <div class="item1" style="background: rgb(204, 11, 11); ">红色</div>
            <div class="item2"></div>
        </div>
    
</body>
</html>

结语

以上的例子,希望大家对z-index属性有更加深入的理解,这个原理明白了,以后完成两张图片叠加
或者说是这样子叠加,层叠的效果,就信手捏来!
~~有问题的,或者哪里说得不对了,希望大家指出来~~ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值