css z-index知多少

一、z-index基础内容(入门)

1.z-index 含义

z-index属性指定了元素及其子元素的在 Z 轴上面的顺序,而在 Z 轴上面的顺序可以决定当元素发生覆盖的时候,哪个元素在上面。通常一个较大z-index值的元素会覆盖较低的那一个

2.z-index 支持的属性值

  • z-index:auto; 默认值
  • z-index:int; 整数值
  • z-index:inherit;继承父元素的z-index属性值

3.z-index的特性

  • 支持负值
  • 支持css3 animation动画
  • 在css2.1时代,需要和定位元素配合使用

4.特殊点

如果不考虑css3 ,只有标记了定位元素position的z-index 才有作用,但是css3 中有例外

{
    
    
  position:static;z-index:2; 
}
{
    
    
  position:relative;z-index:2;
}
{
    
    
  position:absolute;z-index:2;
}
{
    
    
  position:fixed;z-index:2;
}
{
    
    
  position:sticky;z-index:2;
}

static:元素使用正常的布局行为,即元素在文档常规流中当前的布局位置

二、多个定位元素(应用)

1.如果定位元素z-index 没有嵌套

①后来居上的准则
②哪个大,哪个上

  
 .one {
    
    
        position: absolute;
        top: 0;
        left: 0;
        width: 200px;
        height: 200px;
        background-color: #ccc;
      }
      .two {
    
    
        position: absolute;
        top: 50px;
        left: 50px;
        width: 300px;
        height: 300px;
        background-color: pink;
      }
<div class="one">one</div>
<div class="two">two</div>

在这里插入图片描述

①后来居上 (即默认按照dom元素排列的先后顺序,靠后的dom元素排列居上)

 .one {
    
    
        position: absolute;
        top: 0;
        left: 0;
        width: 200px;
        height: 200px;
        background-color: #ccc;
        z-index: 2;
      }
      .two {
    
    
        position: absolute;
        top: 50px;
        left: 50px;
        width: 300px;
        height: 300px;
        background-color: pink;
        z-index: 1;
      }
<div class="one">one</div>
<div class="two">two</div>

在这里插入图片描述

②哪个大,哪个上(当设置有z-index的时候,按照z-index的值排列,值越大,越靠上)

2. 如果定位元素z-index发生嵌套

①祖先优先原则
②特殊情况

    .parent-one {
    
    
        position: relative;
        z-index: 2;
      }
      .one {
    
    
        position: absolute;
        top: 0;
        left: 0;
        width: 200px;
        height: 200px;
        background-color: #ccc;
        z-index: 1;
      }
      .parent-two {
    
    
        position: relative;
        z-index: 1;
      }
      .two {
    
    
        position: absolute;
        top: 50px;
        left: 50px;
        width: 300px;
        height: 300px;
        background-color: pink;
        z-index: 2;
      }
<div class="parent-one">
    <div class="one">one</div>
</div>
<div class="parent-two">
    <div class="two">two</div>
</div>

在这里插入图片描述

①祖先优先原则(当有外层包裹发生嵌套的时候,两个元素的层级比较依赖于祖先的z-index值大小)

     .parent-one {
    
    
        position: relative;
        z-index: auto;
      }
      .one {
    
    
        position: absolute;
        top: 0;
        left: 0;
        width: 200px;
        height: 200px;
        background-color: #ccc;
        z-index: 2;
      }
      .parent-two {
    
    
        position: relative;
        z-index: 1;
      }
      .two {
    
    
        position: absolute;
        top: 50px;
        left: 50px;
        width: 300px;
        height: 300px;
        background-color: pink;
        z-index: 1;
      }
<div class="parent-one">
    <div class="one">one</div>
</div>
<div class="parent-two">
    <div class="two">two</div>
</div>

在这里插入图片描述

②特殊情况(当z-index的值为auto时,当前层叠上下文的生成盒子层叠水平为0,盒子(除非是根元素)不会创建一个新的层叠上下文,因此内层的z-index:2;起了作用)

三、理解css 中的层叠上下文和层叠水平(进阶)

1.概念

我们假定用户正面向(浏览器)视窗或网页,而 HTML 元素沿着其相对于用户的一条虚构的 z 轴排开,层叠上下文就是对这些 HTML 元素的一个三维构想。众 HTML 元素基于其元素属性按照优先级顺序占据这个空间(可高人一等)

在这里插入图片描述

在这里插入图片描述

哪些元素具有层叠上下文呢???

在这里插入图片描述

层叠水平:

层叠上下文中的每个元素都有一个层叠水平(stacjing level),决定了同一个层叠上下文中元素在z轴上的显示顺序。
遵循“后来居上”和“谁大谁上”的原则。
层叠水平必须放在层叠上下文中来看,层叠水平和z-index并不是一个概念。

在这里插入图片描述

3. 层叠水平:

①著名的7阶层叠水平(规范层叠,更符合页面加载的功能和视觉呈现)
在这里插入图片描述

为什么是这样的排序???

在这里插入图片描述

内容是页面中最重要的实体,所以,层叠水平高。

4. z-index 与层叠上下文:

①特性:

  • 定位元素默认z-index:auto可以看成是z-index:0;
  • z-index不为auto的定位元素会创建层叠上下文;
  • z-index层叠顺序的比较止步于父级层叠上下文;

1)为何定位元素会覆盖普通元素?

.a{
    
     }
.b{
    
    margin-left:-30px}

在这里插入图片描述

此时,右边的元素覆盖左边的元素,满足了基本的元素后来居上原则。

.a{
    
    position:relative}  z-index?
.b{
    
    margin-left:-30px}

在这里插入图片描述

如果z-index不做设置,当有定位属性的时候,默认为z-index:auto; 也就是z-index为0。而根据层叠水平规则,z-index:auto是在inline(图片)之上的,因此会反转覆盖。
3)z-index与创建层叠上下文:

.box{
    
    
      position: absolute;
      background: blue;
    }
.img{
    
    
      position: relative;
      margin-left: -100px;
  }


在这里插入图片描述

此时根据层叠水平规则, inline在block之上

.box{
    
    
      position: absolute;
      background: blue;
    	z-index:0;
    }
.img{
    
    
      position: relative;
      margin-left: -100px;
      z-index:-1;
  }

在这里插入图片描述

box添加z-index:0的属性时,此时图片的层叠上下文元素就变成了容器,box的背景色(前提是具有容器的层叠上下文)会在img之下
④z-index受限于层叠上下文:

.box1{
    
    
      position: relative;
      z-index:0;
    }
.box1 img{
    
    
      position: absolute;
      z-index:9999;
    }
.box2{
    
    
      position: relative;
      z-index:1;
  }
.box2 img{
    
    
      position: absolute;
      z-index: -1;
   }

5.其他CSS属性与层叠上下文


.box{
    
    
  background:'blue';  
}
.box>div {
    
    
  z-index:1
}
.box>div>img{
    
    
  position:relative;
  z-index:-1;
}
<div class="box">
  <div>
  	<img src="1.jpg"	/>
  </div>
</div>

在这里插入图片描述

由于box不具有层叠上下文,因此img直接穿过box背景达到根元素的层叠上下文

.box{
    
    
  display:flex;
  background:'blue';  
}
.box>div {
    
    
  z-index:1
}
.box>div>img{
    
    
  position:relative;
  z-index:-1;
}
<div class="box">
  <div>
  	<img src="1.jpg"	/>
  </div>
</div>

在这里插入图片描述

这个并不能说是flex给box添加了层叠上下文而导致了这种情况,而是因为flex当前元素的子元素的z-index不为auto,因此让box具备层叠上下文。

6.z-index与其他CSS属性层叠上下文

①不支持z-index的层叠上下文元素的层叠顺序均是z-index:auto级别
在这里插入图片描述

②依赖z-index的层叠上下文元素的层叠顺序取决于z-index值

四、z-index相关实践(实践)

1.最小化影响原则

目的:
避免z-index嵌套层叠关系混乱

原因:
1.元素的层叠水平主要是由所在的层叠上下文决定;
做法:
1.避免使用定位属性;

2.不犯二准则

目的:
避免z-index混乱,一山比一山高的样式问题。
原因:
多人协作以及后期维护。
做法:
对于非浮层元素,避免设置z-index值,z-index值没有任何道理需要超过2——不犯二准则。

3.组件层级计数器

目的:
避免浮层组件因z-index被覆盖的问题。
原因:
1.总会遇到意想不到的高层及元素;
2.组件的覆盖规则具有动态性;

做法:

通过js获得body下子元素的最大z-index值

4.可访问性隐藏

概念:
人肉眼看不见,但是辅助设备可以识别。
做法:
使用z-index负值元素在层叠上下文的背景之上,其它元素之下。

猜你喜欢

转载自blog.csdn.net/qq_37440870/article/details/126613865