CSS层叠上下文、层叠顺序和层叠等级

CSS 基础:层叠、优先级与继承 阅读详情

0 前言

在讨论层叠上下文和层叠顺序之前先举个例子,创建两个box,其中红色box长200px宽400px,蓝色box长400px宽200px:

  <div class="box">
    <div class="blue-box"></div>
  </div>
  <div class="box">
    <div class="red-box"></div>
  </div>
.box {
  position: relative;
  z-index: auto; /* 默认值 */
}

.blue-box {
  width: 400px;
  height: 200px;
  background: blue;
  position: absolute;
}

.red-box {
  width: 200px;
  height: 400px;
  background: red;
  position: absolute;
}

效果如下:
在这里插入图片描述
在此引出两个问题:

  1. 为什么red-box在blue-box之上?
  2. 怎么让blue-box在red-box之上?

1 层叠上下文

1.1 层叠上下文的概念

之所以元素在浏览器中有显示上下之分,是因为浏览器将页面构想成一个3D的坐标轴,而屏幕的正面即为坐标轴的z轴,如图所示:
在这里插入图片描述
每个页面都有一个默认的层叠上下文,根元素html就是一个层叠上下文,而且其中还可能含有其他的层叠上下文,在同一个层叠上下文中,元素出现的上下顺序叫做层叠等级,决定层叠等级的规则叫做层叠顺序。

前面提到根元素html就是一个层叠上下文,并且还可以在其中创建其他层叠上下文,在CSS中每个层叠上下文的层叠层都是独立的,不受其他层叠上下文的影响,如下图所示,跟元素html之中又有三个独立的层叠上下文,三个独立的层叠上下文中各自有自己的层叠层:
在这里插入图片描述

1.2 创建层叠上下文的方法

满足以下任意一种情况即可创建一个层叠上下文:

  • 根元素html(属于被动创建层叠上下文)
  • position值为非static且z-index值不为auto。
  • 弹性盒模型flex中的元素,且z-index值不为auto。
  • opacity属性值小于1的元素。
  • …

以上列举的是常见的方法,更多方法可查阅文档MDN-层叠上下文。

2 层叠等级

层叠等级决定了同一个层叠上下文中的层叠顺序,并且元素的层叠等级只有在同一个层叠上下文中比较才有意义,如1.1节中三个独立层叠上下文内的A、B、C三个元素,因为这三个元素属于不同的层叠上下文,所以各自拥有独立的层叠顺序,所以将其比较是没有意义的。

在1.1节中的例子里,A、B、C三个元素是没有发生位置重叠的,若此时三个元素发生了位置重叠,如下图所示:
在这里插入图片描述
在进行比较时,由于三个元素属于不同的层叠上下文,所以就要找对应父级元素所在的上下文,即要确定red、green、blue三个层叠上下文的层叠等级,因为这red、green、blue都属于根元素html的层叠上下文中,所以能够进行比较,最终根据父级元素的层叠等级来确定三个子元素A、B、C的显示顺序。

3 被误解的z-index

举个例子如下图所示,red在green和blue之下,所以元素A也在B和C之下,那么怎么让A显示在最上面呢?
在这里插入图片描述
相信有人肯定会马上给出答案:给元素A设置CSS样式:z-index: 9999;这样元素A就显示在所有元素之上了。其实这种说法是错误的,这也是很多人对于z-index的误解。

确实,当需要指定不同的排列顺序时,只要给元素指定一个z-index数值,该数值必须是一个整数(正整数和负整数),这个数值表示了元素在z轴的位置,数值越大,元素越在z轴的最上方。但是,z-index的使用是有先决条件的:

  1. z-index只适用于定位的元素,对非定位元素无效,如果一个元素没有指定z-index,那么其默认值是auto(z-index的0层)。
  2. 元素的z-index值只有在同一个层叠上下文中才有意义。

根据第两个先决条件可知,由于元素A、B、C不属于同一个层叠上下文,所以即使给元素A设置CSS样式:z-index: 9999;也无法将A元素置于所有元素之上。

4 层叠顺序

当元素发生重叠时,下图描述了7种元素类型对应的层叠顺序:
在这里插入图片描述
在这里插入图片描述
图中的顺序很好理解,但是有几点值得注意:

  1. 内联元素(inline/inline-block)的层叠顺序高于浮动float元素和块级block元素:这个容易理解,网页的重点是显示内容,如内联元素span用于定义文本块,内联元素img用于显示图片,所以理所当然的使这类表示内容的内联元素拥有更高的层叠顺序。
  2. 浮动float元素的层叠顺序高于块级block元素。
  3. 虽说z-index:auto和z-index:0在同一层叠顺序,但是两者有着重要的区别:参照1.2节中创建层叠上下文的方法,z-index:auto是不会创建一个新的层叠上下文的,而z-index:0能够创建一个新的层叠上下文。

另外可以通过下面的图片对层叠顺序进行记忆:
在这里插入图片描述
除去z-index相关的层叠顺序,由表示内容的内联元素层叠顺序最高,其次是表示内容布局的浮动元素和块级元素,最后是用于装饰内容的层叠上下文的背景和边框。

5 判断层叠顺序的方法

  1. 在同一个层叠上下文中,其内部元素的层叠顺序按照第4章中的层叠顺序图来排列。
  2. 在同一个层叠上下文中,若两个元素的层叠顺序相同,则后面的元素会在前面的元素之上。
  3. 在不同层叠上下文的情况下比较两个元素的层叠顺序,需要向上查询其父元素所在的层叠上下文,直到两者的某一级父元素在同一层,再比较这两个父级元素的层叠顺序。

6 前言中的问题

在这里插入图片描述
前言中留下了两个问题:

  1. 为什么red-box在blue-box之上?
    a. 首先判断两个两个box是否在同一个层叠上下文中,由于red-box和blue-box都拥有一个父元素box,父元素box中含有非static定位属性,但是z-index为auto,所以父元素box并没有形成单独的层叠上下文,所以这两个box同属于根元素html的层叠上下文中,因此red-box和blue-box也属于同一个层叠上下文。
    b. 此时再判断red-box和blue-box的层叠顺序,由于red-box和blue-box属于同种类型的元素,两者拥有相同的层叠顺序,所以后出现的red-box会位于blue-box之上。
  2. 怎么让blue-box在red-box之上?
    (1)方案一:根据对于问题1的分析,可以将red-box和blue-box互换位置,如下代码,这样blue-box就成为了后出现的元素:
<div class="box">
  <div class="red-box"></div>
</div>
<div class="box">
  <div class="blue-box"></div>
</div>

(2)方案二:由于red-box和blue-box属于同一个层叠上下文,所以可以通过z-index属性将blue-box置于red-box之上,如下代码,给blue-box添加z-index: 2,给red-box添加z-index: 1:

.blue-box {
  width: 400px;
  height: 200px;
  background: blue;
  position: absolute;
  z-index: 2; /* 添加z-index */
}

.red-box {
  width: 200px;
  height: 400px;
  background: red;
  position: absolute;
  z-index: 1; /* 添加z-index */
}

(3)方案三:方案一和方案二都是在同一个层叠上下文的条件下,方案三将red-box和blue-box置于两个不同的层叠上下文,修改代码如下:

<div class="box1">
  <div class="blue-box"></div>
</div>
<div class="box2">
  <div class="red-box"></div>
</div>

通过将父级box1和box2的z-index修改为0而创建了两个单独的层叠上下文。

.box1, .box2 {
  position: relative;
  z-index: 0; /* 创建层叠上下文 */
}

.blue-box {
  width: 400px;
  height: 200px;
  background: blue;
  position: absolute;
  z-index: 2;
}

.red-box {
  width: 200px;
  height: 400px;
  background: red;
  position: absolute;
  z-index: 1;
}

注意:此时red-box和blue-box的z-index还保留了,效果如图:
在这里插入图片描述
可以发现red-box和blue-box的z-index失效了,即使blue-box的z-index比red-box大也无济于事,这也正好验证了关键结论“元素的z-index值只有在同一个层叠上下文中才有意义”。这里之所以red-box还在blue-box之上是因为其父级box在根元素html层叠上下文中的层叠顺序。

所以在这个例子中,想要实现blue-box在red-box之上,需要通过z-index修改box1和box2的层叠顺序:

    .box1 {
      position: relative;
      z-index: 1;
    }

    .box2 {
      position: relative;
      z-index: 0;
    }

效果如下:
在这里插入图片描述

7 总结

在实际开发中,需要牢记的内容有:

  1. 创建层叠上下文的方法:MDN-层叠上下文
  2. z-index的使用条件:必须是定位元素且比较z-index的元素在同一个层叠上下文,参阅第3章内容。
  3. 层叠顺序:可以按照如下方法记忆(由高到低):
    a. 正z-index
    b. 默认值z-index:auto、z-index:0(注意两者区别,参阅第4章内容)
    c. 表示内容的inline/inline-block
    d. 表示布局的float浮动元素和block块级元素
    e. 负z-index
    f. 表示装饰的层叠上下文的背景和边框
  4. 判断层叠顺序的方法,参阅第5章内容。
CSS层级问题以及CSS透明效果 阅读详情

相关推荐

CSS三大特性之层叠性~

类选择器的权重大于标签选择器,所以此时应该显示的是类选择器中指定的样式,但由于在标签选择器的color属性后面,使用了!important,所以字体的颜色显示出来的是标签选择器中的样式,并非类选择器中的样式。原因就是我们上述所说的,子元素继承的权重为0, 即使父元素的权重很高,但是在子元素这里都是0,因此p标签中的文字显示的效果为元素选择器中的样式。在style中,我们并没有给p标签设置任何的属性,但由于它是div标签的子标签,所以他最终显示的效果是div的样式。/*li权重是:0,0,0,1 1*/

m0_64365419的博客 1715

z-index:9999在CSS中是什么意思

z-index属性:较大 number 值的对象会覆盖在较小 number 值的对象之上。如两个绝对定位对象的此属性具有同样的 number 值,那么将依据它们在HTML文档中声明的顺序层叠。对于未指定此属性的绝对定位对象,此属性的 number 值为正数的对象会在其之上,而 number 值为负数的对象在其之下。设置参数为 null 可以移除此属性。 因此,在z-index属性值相同的

csdn_huangyumin的博客 3503

状态转移矩阵在离散控制系统中的应用与实现步骤详解

本文深入解析了状态转移矩阵在离散控制系统中的核心作用与实现步骤。通过一个具体实例,详细演示了如何将连续状态空间模型精确离散化,计算出离散系统矩阵A_d和B_d,并分享了采样周期选择、数值计算技巧及嵌入式C语言实现等关键工程经验,为开发高性能数字控制器提供实用指南。

weixin_28454475的博客 381

css层叠

css层叠概念 层叠是CSS的一个基本特征,就是浏览器对多个样式来源进行叠加,最终确定结果的过程. 例子1: 三种选择器同时给P标签增加颜色的属性,但是,文字最终显示的是蓝色,这个时候,就出现了层叠性的情况。 选择器排序优先级 ID选择器 > 类选择器 > 标签选择器 例子2:计算权重 统计各个选择器的数量,优先级高的胜出。文字的颜色为红色。 例子3:权重相同时 就近原则:第一个样式和第二个样式的权重相同。但第二个样式的书写顺序靠后。 例子4:让一个列表实现如

JerryQuery的博客 780

【CAN通讯系列18】- NM在干什么?休眠唤醒

同时针对不同休眠或唤醒场景,网管报文的userdata有所区别,如何做到场景与网管报文内容一一映射,通常会定义另一帧报文,用来表明当前是哪个或哪几个唤醒条件或休眠条件满足。又或者如果用户发现汽车电量不充足了,那么会有充电需求,插枪充电,这时如果插上慢充枪,那么OBC会先被唤醒,识别出插枪行为及其慢充枪的连接状态,然后OBC唤醒BMS和其他相关的控制器进行充电。也就是说,通过对一个又一个整车功能和应用场景的详细分析,最终能够汇总出整车所有的休眠唤醒场景需求,通常会用一个表格来管理,俗称休眠唤醒表。

menghuyouyou的博客 1169

perftest实战:从零到一,精准评估RDMA网络性能

想象一下,两台服务器传输数据就像在同一个主板上交换内存,这种零拷贝、低延迟的特性,正是高性能计算、分布式存储等场景梦寐以求的。对于云环境用户,主流云厂商现在都提供RDMA实例(比如AWS的EFA、阿里云的eRDMA)。但要注意,不同机型支持的RDMA协议版本可能不同,这会直接影响测试结果的上限值。记得记录每次测试的BW average值,绘制成曲线图后,你可能会发现类似"阶梯状"的性能变化,这通常与网卡的DMA引擎设计有关。在云环境中,由于虚拟化层的影响,延迟会比裸金属高20-30%。

weixin_28700411的博客 214

css--深入由z-index引发的层叠上下文、层叠等级和层叠顺序的思考

代码段1如下:我们只需要改变box盒子的z-index值的大小就会改变盒子的层叠顺序。 复制代码 box1 box2 box3 复制代码   初次看上面的代码,会发现 z-index 值越大在z轴上就越靠上,离浏览器屏幕越近。但是仔细思考,你会发现这里存在很多疑惑:z-index是在任何元素上面都有效果吗?难道z-index的值的大小直接影响到元素的层叠顺序吗? 我们再来看下下面的代码段2: 复制代码 1 2

weixin_45032957的博客 413

simulink构建一个基于 BP(反向传播)神经网络 的自适应 PID 控制系统

本文介绍了基于BP神经网络的自适应PID控制系统设计方法。系统通过神经网络实时调整PID参数,实现智能控制。主要内容包括:1)系统架构设计,采用误差反馈和在线学习机制;2)详细建模步骤,从被控对象定义到神经网络结构设计;3)S-Function实现核心算法,包含前向传播、PID计算和反向传播;4)仿真结果分析,显示神经网络PID在响应速度、超调控制和鲁棒性方面的优势;5)进阶建议和常见问题解决方案。该方法突破了传统PID的局限性,实现了具有自我学习能力的智能控制。

xiaoheshang_123的博客 52

vb6 combo根据index显示_彻底搞懂CSS层叠上下文、层叠等级、层叠顺序、z-index

前言最近,在项目中遇到一个关于CSS中元素z-index属性的问题,具体问题不太好描述,总结起来就是当给元素和父元素色设置position属性和z-index相关属性后,页面上渲染的元素层级结果和我预想的不一样。根据自己之前的理解,也没找到一个合理的解释。我知道,肯定是我对相关属性的细节理解存在问题,所以结合官方文档和在网上各种搜集整理,明白了其中的原因。写下这篇文章,和大家分享有关CSS中层叠上...

weixin_39955154的博客 249

七天征服AutoSAR/SomeIP_01速成配置并代码生成

本文为AutoSAR中SomeIP配置开发的实操指南摘要,重点介绍通过通信矩阵快速构建SomeIP工程的方法。核心内容包括:1)基于Excel通信矩阵生成系统描述文件(arxml);2)在AutoSAR工具中导入文件自动生成协议栈配置,涵盖ETHIF、SoAd等模块;3)关键报错处理(COM/PDUR/SOAD/SD模块的配置修正);4)SomeIPXF的数据编解码配置;5)SWC组件与RTE任务映射。教程强调"先完成再完美"的实践原则,指导开发者快速生成基础代码框架,为后续协议调试奠定

大叔带刺的博客 304

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1651

什么是层叠上下文?如何形层叠上下文?层叠顺序是怎样的?

在CSS2.1规范中,每个盒模型的位置是三维的,分别是平面画布上的x轴,y轴以及表示层叠的z轴。层叠上下文即元素在某个层级上z轴方向的排列关系。 那么这里有几个重要的概念:层叠上下文 (堆叠上下文, Stacking Context)、层叠等级 (层叠水平, Stacking Level)、层叠顺序 (层叠次序, 堆叠顺序, Stacking Order)、z-index。 1. 层叠上下文 ...

weixin_33895016的博客 571

小波变换(深入浅出)

小波变换

weixin_46713695的博客 3万+

前端面试系列-CSS-层叠上下文、层叠等级、层叠顺序、z-index

前端面试系列-CSS-层叠上下文、层叠等级、层叠顺序、z-index 如果一个元素含有层叠上下文,(也就是说它是层叠上下文元素),我们可以理解为这个元素在Z轴上就“高人一等”,最终表现就是它离屏幕观察者更近。 - 在**同一个层叠上下文中**,它描述定义的是该层叠上下文中的层叠上下文元素在Z轴上的上下顺序。 - 在其他普通元素中,它描述定义的是这些普通元素在Z轴上的上下顺序。 1、首先先看要比较的两个元素是否处于同一个层叠上下文中: - 如果是,谁的层叠等级大,谁在上面(怎么判断层叠等级大小呢?——看“层叠

LYFlied的博客 807

Python代码加密与发布方案详解

本文详细介绍了多种Python代码保护方案,从基础加密到高级混淆,以及商业化发布的最佳实践。基础加密方案包括编译为字节码和使用PyArmor基础加密,适合临时保护和小项目。商业级加密方案如Cython编译和Nuitka完整打包,提供更高的保护强度和执行效率。高级混淆方案涉及控制流混淆、字符串加密和完整混淆工具链,进一步增加逆向难度。商业化发布方案则强调许可证系统集成、硬件绑定保护和完整发布流程。此外,文章还探讨了反逆向技术、最佳实践建议和常见问题解决方法。通过组合使用这些技术,可以构建出适合不同安全需求的P

数据知道的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

CSS 中重要的层叠概念

最近在项目的过程中遇到了一个问题,menu-bar希望始终显示在最上面,而在之后的元素都显示在它之下,当时设置了 z-index 也没有效果,不知道什么原因,因此找了一下css有关层叠方面的资料,解决了这个问题,这里记录一下~

前端下午茶 852

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

css叠层_关于CSS中重要的层叠效应

最近在项目的过程中遇到了一个问题,menu-bar希望始终显示在最上面,而在之后的元素都显示在它之下,当时设置了 z-index 也没有效果,不知道什么原因,因此找了一下css有关层叠方面的资料,解决了这个问题,这里记录一下~屏幕是一个二维平面,然而HTML元素却是排列在三维坐标系中,x为水平位置,y为垂直位置,z为屏幕由内向外方向的位置,我们在看屏幕的时候是沿着z轴方向从外向内的;由此,元素在用...

weixin_36338765的博客 456

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

CSS层叠上下文/层叠等级

什么是“层叠上下文” 层叠上下文(stacking context),是html中一个三维的概念。在css2.1规范中,每个盒模型的位置是三维的,分别是平面画布上的X轴,Y轴以及表示层叠的Z轴。一般情况下,元素在页面上沿X轴Y轴平铺,我们察觉不到它们在Z轴上的层叠关系。而一旦元素发生堆叠,这时就能发现某个元素可能覆盖了另一个元素或者被另一个元素覆盖。 什么是“层叠等级” 层叠等级(stacking level,叫“层叠级别”/“层叠水平”也行) 在同一个层叠上下文中,它描述定义的是该层叠上下文.

高先生的猫 572

元素层叠总结

重点:在相同的层叠环境及优先级下,inline/inline-block元素的层叠顺序高于block元素。 详解链接: https://www.codercto.com/a/23706.html 本文转载自:https://juejin.im/post/5b876f86518825431079ddd6,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。 ...

weixin_30362233的博客 276

web前端入门到实战:CSS 层叠上下文(Stacking Context)

在网页制作的过程中,元素与元素之间的位置关系,在坐标轴上一般可体现为 X 轴、Y 轴和 Z 轴。对于 X 轴和 Y 轴的定位大多数开发都能比较直观的搞清楚,而 Z 轴 则相对较为模糊,或者说不能全面的理解Z轴的显示逻辑。大多数人都知道可以使用 position 属性配合 z-index 属性解决元素的 Z 轴显示问题,对于更深层次的原理却不太了解。本文主要介绍了层叠上下文、层叠等级、层叠顺序等概念...

web前端开发教程htmlcssjs 452

CSS 层叠上下文(Stacking Context)

在网页制作的过程中,元素与元素之间的位置关系,在坐标轴上一般可体现为 X 轴、Y 轴和 Z 轴。对于 X 轴和 Y 轴的定位大多数开发都能比较直观的搞清楚,而 Z 轴 则相对较为模糊,或者说不能全面的理解Z轴的显示逻辑。大多数人都知道可以使用 position 属性配合 z-index 属性解决元素的 Z 轴显示问题,对于更深层次的原理却不太了解。本文主要介...

在线学习web前端开发教程 521

彻底搞懂CSS层叠上下文、层叠等级、层叠顺序、z-index

最近,在项目中遇到一个关于 CSS 中元素z-index属性的问题,具体问题不太好描述,总结起来就是当给元素和父元素色设置position属性和z-index相关属性后,页面上渲染的元素层级结果和我预想的不一样。根据自己之前的理解,也没找到一个合理的解释。我知道,肯定是我对相关属性的细节理解存在问题,所以结合官方文档和在网上各种搜集整理,明白了其中的原因。写下这篇文章,和大家分享有关 CSS 中层叠上下文、层叠等级、层叠顺序以及z-index相关的一整套技术细节。...

油墨香^-^的博客 816

css世界知识点总结之层叠上下文部分

待完善

我们一起学前端 273

[html] 说说你对这几个概念的理解:层叠上下文、层叠等级、层叠顺序

[html] 说说你对这几个概念的理解:层叠上下文、层叠等级、层叠顺序 层叠上下文(stacking context),是HTML中一个三维的概念。在CSS2.1规范中,每个盒模型的位置是三维的,分别是平面画布上的X轴,Y轴以及表示层叠的Z轴。 如果一个元素含有层叠上下文,(也就是说它是层叠上下文元素),我们可以理解为这个元素在Z轴上就“高人一等”,最终表现就是它离屏幕观察者更近。 层叠等级(stacking level,“层叠级别”/“层叠水平”)。在同一个层叠上下文中,它

歌谣的博客 449
上一篇: CSS中的BFC机制
下一篇: JavaScript中this的五种绑定方式详解
syzdev
博客等级 码龄9年 852粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值