css之层叠上下文

之前调元素的显示优先级时,只会默默的调z-index以达到效果,但有时不生效,又不知道根因。刚好详细了解到层叠上下文,可以解释此类问题。

什么是层叠上下文?

在CSS2.1规范中,每个盒模型的位置是三维的,分别是平面画布上的X轴,Y轴以及层叠Z轴。 一般情况下,元素在页面上沿X轴Y轴平铺,我们察觉不到它们在Z轴上的层叠关系,而一旦元素发生堆叠,这时我们就能发现某个元素可能覆盖了另一个元素或者被另一个元素覆盖。 我们这里要讨论的层叠上下文(stacking context),就是HTML中的一个三维概念,即元素的z轴,层级越高越接近阅读者。

层叠上下文触发条件

一般来讲有3种方法:

  • HTML中的根元素html本身就具有层叠上下文,称为“根层叠上下文”。
  • 普通元素设置position属性为非static(relatice、absolute、fixed、sticky)值并设置z-index属性为具体数值,会产生层叠上下文。
  • CSS3中的新属性也可以产生层叠上下文。
  • 父元素的display属性值为flex | inline-flex,子元素z-index属性值不为auto的时候,子元素为层叠上下文元素。
  • 元素的opacity属性值不是1。
  • 元素的transform属性值不是none。
  • 元素mix-blend-mode属性值不是normal。
  • 元素的filter属性值不是none。
  • 元素的isolation属性值是isloate。
  • will-change 指定的属性值为上面任意一个。
  • 元素的-webkit-overflow-scrolling属性值设置为touch。)

案例分析

案例分析1:

<div class="one"></div><div class="two"></div>
div {width: 200px;height: 200px;}.one {background-color: blue;}.two {background-color: green;margin-top: -100px;}

在示例代码中,我们创建了两个div,然后使其产生重叠,默认情况下后来居上,绿色的会盖住蓝色的。

下面我们给蓝色设置一个定位,如下:

.one {background-color: blue;position: relative;z-index: 1;}

由于设置了定位和z-index属性,所以蓝色的div就会创建一个层叠上下文,在Z轴上就“高人一等”。

层叠等级与层叠顺序

除了层叠上下文,我们还需要了解两个概念:

  • 层叠等级(stacking level)
  • 层叠顺序(stacking order)

这两个东西实际上都是用来描述:在同一层叠上下文中,元素在Z轴上的显示顺序(前一个是概念,后一个是规则)。

  1. 如果两个元素在同一个层叠上下文中,那么层叠等级越大的元素,就越靠前。
  2. 如果两个元素不再同一个层叠上下文,此时就先比较它们所处的层叠上下文的层叠登记,也就是所谓的“从父”现象。
  3. 当两个元素层叠等级相同、层叠顺序相同,在DOM结构中后面的元素层叠等级在前面元素之上。

层叠顺序图:

案例分析2:(比较所处的层叠上下文的层叠等级)

<div class="one"><div class="item" style="background-color: black; z-index: 99;"></div></div><div class="two"><div class="item" style="background-color:pink;top:50px; z-index: 1;"></div></div>
div {width: 200px;height: 200px;}.one {background-color: blue;position: relative;z-index: 1;}.two {background-color: green;position: relative;z-index: 2;}.item {width: 100px;height: 100px;left: 200px;top: 200px;position: absolute;}

在上面的代码中,one和two分别有自己的层叠山下文,但是two的层叠等级要比one高,之后我们可以看到,无论one中的子元素的z-index设置有多高,它始终被two的子元素覆盖,因为两个元素不在同一个层叠上下文中,比较的是所在层叠上下的等级。

案例分析3:在同一个层叠上下文

<div class="box1"><div class="child1"></div></div><div class="box2"><div class="child2"></div></div>
.box1,.box2 {position: relative;}.child1 {width: 200px;height: 100px;position: absolute;background-color: blue;top: 0;left: 0;z-index: 2;}.child2 {width: 100px;height: 200px;position: absolute;background-color: red;top: 0;left: 0;z-index: 1;}

在上面的示例中,.box1/.box2虽然设置了position:relative,但是没有设置z-index。所以.box1/.box2仍然是普通元素,所以.box1/.box2属于html元素的“根层叠上下文”中,也就是处于同一个层叠上下文中,根据层叠顺序谁的z-index值大,谁在上面。

对上面的代码稍加修改,呈现效果完全不同
box1,.box2 {position: relative;z-index: 0;}

因为设置z-index: 0后,.box1/.box2产生了各自的层叠上下文,这时候要比较.child1/.child2的层叠关系属于不同的层叠上下文进行比较,此时由各自所在的.box1/.box2的层叠关系来决定。 但是.box1/.box2的z-index值都为0,都是块级元素(所以它们的层叠等级、层叠顺序是相同的),这种情况下,在DOM结构中后面的覆盖前面的,所以.child2就在上面。

案例分析4

<div class="box"><img src="./pane.png" alt="" class="item"></div>
.box {width: 200px;height: 200px;background-color: blue;position: absolute;}.item {position: absolute;width: 200px;top: 50px;left: 50px;z-index: -1;}

.box1设置了position,但没有设置z-index,所以没产生层叠上下文,对于.item而言,找到的层叠上下文是html根元素。而依据层叠顺序,block块状水平盒子的层叠顺序高于z-index为负的。

而如果给.box设置z-index后,就会产生一个层叠上下文,此时对于图片.item而言,找到的层叠上下文是.box,根据层叠顺序图,background是处于最下层的,所以图片显示在上面。

案例5:CSS3新属性

<div class="box"><div class="parent">parent<div class="child">child</div></div></div>
.box {display: flex;}.parent {width: 200px;height: 100px;background-color: red;z-index: 1;}.child {width: 100px;height: 200px;position: relative;background-color: green;z-index: -1;}

.parent会变成一个弹性元素,成为一个层叠上下文元素。于是对于.child来讲找到的层叠上下文就是.parent了,而非html元素。 根据层叠顺序,background的层叠等级小于z-index值小于0的元素的层叠等级,所以.child在.parent上面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/99552.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macOS通过钥匙串访问找回WiFi密码的详细教程

如果您忘记了Mac电脑上的WiFi密码&#xff0c;可以通过钥匙串访问来找回它。具体步骤如下&#xff1a; 1.打开Mac电脑的“启动台”&#xff0c;然后在其他文件中找到“钥匙串访问”。 2.运行“钥匙串访问”应用程序&#xff0c;点击左侧的“系统”&#xff0c;然后在右侧找到…

中级深入--day19

鼠标动作链 有些时候&#xff0c;我们需要再页面上模拟一些鼠标操作&#xff0c;比如双击、右击、拖拽甚至按住不动等&#xff0c;我们可以通过导入 ActionChains 类来做到&#xff1a; 示例&#xff1a; #导入 ActionChains 类 from selenium.webdriver import ActionChains…

虚拟机(三)VMware Workstation 桥接模式下无法上网

目录 一、背景二、解决方式方式一&#xff1a;关闭防火墙方式二&#xff1a;查看桥接模式下的物理网卡是否对应正确方式三&#xff1a;查看物理主机的网络属性 一、背景 今天在使用 VMware Workstation 里面安装的 Windows 虚拟机的时候&#xff0c;发现虽然在 NAT 模式下可以…

【Sentinel】核心API-Entry与Context

文章目录 一、Entry1、Entry的声明2、使用API自定义资源3、基于SentinelResource注解标记资源 二、Context1、Context介绍2、Context的初始化3、AbstractSentinelInterceptor4、ContextUtil 一、Entry 1、Entry的声明 默认情况下&#xff0c;Sentinel会将controller中的方法作…

Flink实时计算中台Kubernates功能改造点

背景 平台为数据开发人员提供基本的实时作业的管理功能,其中包括jar、sql等作业的在线开发;因此中台需要提供一个统一的SDK支持平台能够实现flink jar作业的发布;绝大多数情况下企业可能会考虑Flink On Yarn的这个发布模式,但是伴随云原生的呼声越来越大,一些企业不希望部…

Java之文件操作与IO

目录 一.认识文件 1.1文件是什么&#xff1f; 1.2文件的组织 1.3文件路径 1.4文件的分类 二.文件操作 2.1File概述 三.文件内容操作--IO 3.1JavaIO的认识 3.2Reader和Writer ⭐Reader类 ⭐Writer类 3.2FileInputStream和FileOutputStream ⭐FileInputStream类 …

Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法

不论搭建什么工程&#xff0c;运行什么文件&#xff0c;只要在Pycharm中出现ImportError: DLL load failed: 找不到指定的模块这样的问题&#xff0c;以下方法都适用&#xff01;&#xff01;&#xff01; 一、问题描述 我在使用pycharm连接webots&#xff0c;用python控制机…

设计模式-装饰模式

文章目录 一、简介二、基本概念三、装饰模式的结构和实现类图解析&#xff1a;装饰器的实现方式继承实现&#xff1a;组合实现&#xff1a;继承和组合对比 四、装饰模式的应用场景五、与其他模式的关系六、总结 一、简介 装饰模式是一种结构型设计模式&#xff0c;它允许动态地…

【Unity-Cinemachine相机】相机跟随之Transposer属性

相机跟随和瞄准行为 Transposer&#xff1a;虚拟相机将在某个固定的偏移或距离上跟随目标移动 上面的偏移量就是Follow Offset Binding Mode决定Follow Offset是目标本地坐标系下的身后十米还是世界坐标系下的身后十米 Lock To Target On Assign&#xff1a;锁定自己和目标本地…

【Git-Exception】Git报错:fatal: unable to auto-detect email address

报错信息&#xff1a; *** Please tell me who you are. Run git config --global user.email “youexample.com” git config –global user.name “Your Name” to set your account’s default identity. Omit --global to set the identity only in this repository. fatal…

Unity汉化一个插件 制作插件汉化工具

我是编程一个菜鸟&#xff0c;英语又不好&#xff0c;有的插件非常牛&#xff01;我想学一学&#xff0c;页面全是英文&#xff0c;完全不知所措&#xff0c;我该怎么办啊...尝试在Unity中汉化一个插件 效果&#xff1a; 思路&#xff1a; 如何在Unity中把一个自己喜欢的插件…

nmp ERR! code ERR SOCKET TIMEOUT nmp ERR!network npmSocket timeout(已解决)

当安装vue-cli时&#xff0c;出现超时错误 npm ERR! code ECONNRESET npm ERR! network This is a problem related to network connectivity npm ERR! code ECONNRESET npm ERR! network aborted npm ERR! network This is a problem related to network connectivity. npm E…