CSS专题之层叠上下文

article/2025/6/9 10:37:55

前言

石匠敲击石头的第 15 次

在平常开发的时候,有时候会遇到使用 z-index 调整元素层级没有效果的情况,究其原因还是因为对层叠上下文不太了解,看了网上很多前辈的文章,决定打算写一篇文章来梳理一下,如果哪里写的有问题欢迎指出,不胜感激。

什么是层叠上下文

层叠上下文(Stacking Context)是 HTML 中的三维概念,它决定了元素在 Z 轴(垂直于电脑屏幕的方向) 上的显示顺序。简单来说,层叠上下文是浏览器用来组织元素 Z 轴方向堆叠顺序的一个独立的 “视觉区域” 或 “作用域”

在这里插入图片描述

层叠上下文的概念有点类似于块级格式化上下文(BFC),都是在特定条件下由元素创建的独立作用区域,并且区域内遵循各自的规则,但它作用在视觉层级(z-index)而非布局流

什么是层叠水平

在一个层叠上下文中,层叠水平(Stacking Level,也叫层叠等级) 用于确定其子元素在 Z 轴方向上的显示优先级,简单来说,层叠水平决定了同一层叠上下文内的元素谁在上、谁在下

⚠️ 注意:

  • 元素的层叠水平是由其所属的层叠上下文来决定的,也就是说层叠水平的比较只有在同一个层叠上下文中才有意义,所以不同层叠上下文之间的元素不会互相影响
  • 某些情况下(Flex 子元素和定位元素) z-index 确实可以影响元素的层叠水平,但层叠水平不等于 z-index所有元素都有层叠水平

什么是层叠顺序

层叠上下文和层叠顺序这两个终究只是抽象的概念,但元素具体是按照什么规则层叠的,这就不得不提层叠顺序(Stacking Order)

简单来说,层叠顺序就是指当多个元素在 Z 轴方向发生重叠时,浏览器决定哪些元素显示在上、哪些元素被遮挡的一套规则。

在这里插入图片描述

上图展示了在不考虑 CSS3 新特性(如 flexgridisolation 等)的前提下,浏览器在同一层叠上下文中渲染元素的顺序,从下往上堆叠。

⚠️ 注意:

  • 左上角的层叠上下文 background / border 是指层叠上下文元素的边框和背景颜色,是最低的层叠等级

  • inlineinline-block 元素是相同的层叠等级,并且要高于 blockfloat 元素

  • 之所以文字相关元素(通常是 inline)层叠等级更高,是出于网页设计初衷:优先保障文字可见性,避免被大面积背景或容器遮挡

  • z-index: 0z-index: auto 从层叠等级上看相同的,但实际上两个属性值有着根本的区别,具体区别可以看下表

    属性值是否创建层叠上下文说明
    z-index: auto不会创建新的层叠上下文元素仍处于父级的层叠上下文中
    z-index: 0会创建层叠上下文(前提是元素是定位元素)positionrelativeabsolutefixedsticky 时生效

层叠准则

知道了前面这些,我们还需要掌握:当多个元素发生重叠时,到底谁在上,谁在下

其实只需要遵循这套判断准则就可以判断,为此我画了一张流程图:

在这里插入图片描述

⚠️ 注意:

  • 元素的层叠等级可以参考前面的 “层叠顺序图”,谁的层叠等级高,谁就显示在上方
  • 如果你发现调整 z-index 无效,极有可能是因为你正试图比较不在同一层叠上下文的元素

层叠上下文特性

跟 BFC 一样,层叠上下文也是一种独立作用域机制,具备以下特性:

  • 层叠上下文元素的层叠水平要比 普通元素(没有创建层叠上下文的元素)
  • 层叠上下文元素可以阻断元素的混合模式
  • 层叠上下文可以嵌套,内部层叠上下文元素及其所有子元素均受制于外部的层叠上下文
  • 层叠上下文是一个独立的渲染区域,其内部的层叠顺序只在自身作用范围内起作用
  • 层叠上下文元素不会和它同级的 “兄弟元素” 或 “兄弟上下文” 互相干扰彼此内部的层叠顺序

如何创建层叠上下文

前面说了那么多,那应该如何让一个元素变成层叠上下文元素呢?

大致有如下几种方式可以创建:

  • 根元素 <html> 本身就是一个层叠上下文元素,称为 “根层叠上下文”

  • 元素的 position 属性为static 值,并设置 z-index 属性值为非 auto,就可以创建层叠上下文

    ⚠️ 注意: 在早期版本的 Firefox 和 IE 浏览器中,使用 position: fixed 也需要显式设置 z-index 为非 auto 值才能触发层叠上下文的创建,但在现代浏览器中,position: fixed 本身就能自动创建层叠上下文,即使没有设置 z-index,这时元素的层叠等级在 “层叠顺序图” 的 z-index:0/auto 一级。

    在这里插入图片描述

  • z-index 值不为 autoflex 子元素(父元素的 display 属性值为 flex 或者 inline-flex 的元素)

  • 元素的 opacity 值不为 1

  • 元素的 transform 值不为 none

  • 元素的 mix-blend-mode 值不为 normal

  • 元素的 filter 值不为 none

  • 元素的 isolation 值不为 isolate

  • 元素的 will-change 值为前面提到的任意一个属性(例如:will-change: opacity;

  • 元素的 -webkit-overflow-scrolling 值为 touch

案例演示

正所谓实践出真知,接下来我们通过几个典型案例,来验证和巩固前面讲到的层叠上下文知识。

案例 1

.box {position: relative;
}.a {position: absolute;background-color: blue;z-index: 1;
}.b {position: absolute;background-color: green;z-index: 2;
}.c {position: absolute;background-color: red;z-index: 3;
}/* 其它样式... */
<div class="box"><div class="item a">a</div><div class="item b">b</div>
</div>
<div class="box"><div class="item c">c</div>
</div>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在线预览效果

上面这段代码中大家可以先想一下 abc 元素它们的层叠上下文分别是由哪个元素创建的?

答案是:

  • abc 三个元素的父元素 .box 虽然设置了 position: relative;,但没有设置 z-index,所以不会产生层叠上下文,所以三个元素就都处于 <html> 标签产生的 “根层叠上下文”
  • 所以在同一层叠上下文中 c 元素的 z-index 值最大,自然就出现在最前面

案例 2

.box1 {position: relative;z-index: 2;
}.box2 {position: relative;z-index: 1;
}.a {position: absolute;background-color: blue;z-index: 1;
}
.b {position: absolute;background-color: green;z-index: 2;
}
.c {position: absolute;background-color: red;z-index: 3;
}/* 其它样式... */
<div class="box1"><div class="item a">a</div><div class="item b">b</div>
</div>
<div class="box2"><div class="item c">c</div>
</div>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在线预览效果

上述代码的主要结构跟案例 1 类似,只是对 abc 三个元素的父元素增加了 z-index,使之产生层叠上下文。

大家可以想一下,为什么明明 c 元素的 z-index 值最大,却被比它小的 ab 元素给盖住?

答案是:

  • ab 元素在同一个层叠上下文中,而 c 元素单独在另外一个层叠上下文中

  • 此时根据层叠准则,会进行 “所属的层叠上下文” 的层叠等级比较

    • ab 元素 “所属的层叠上下文” 元素 box1z-index2
    • c 元素 “所属的层叠上下文” 元素 box2z-index1

    所以 c 元素被 ab 元素盖住

  • ab 元素因为是在同一个层叠上下文中,它们之间比较则是根据自身的 z-index 值,b 元素的值比 a 元素的大,所以 b 元素盖住了 a 元素

案例 3

在过去 CSS 2.1 的时代,z-index 通常必须和定位元素一起使用才有效果,但现在 CSS3 中非定位元素也可以使用 z-index

.container {display: flex;
}.box1 {background-color: skyblue;width: 100px;height: 100px;margin: 20px;z-index: 2;
}.box2 {background-color: tomato;width: 150px;height: 150px;margin: 30px 0 0 -80px;z-index: 1;
}/* 其它样式... */
<div class="container"><div class="box1">box1</div><div class="box2">box2</div>
</div>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在线预览效果

我们可以看到 box2 元素被 box1 元素所盖住,所以我们在使用 Flex 布局的时候,可以无需将 Flex 子元素设置为定位元素就可以使用 z-index

⚠️ 注意:

  • 由于 .box1.box2flex 子元素,并且都设置了 z-index此时它们都是层叠上下文元素,同时 z-index 生效
  • .box.box2 在同一个层叠上下文中,因为父元素 .container 不是层叠上下文元素,所以都处于 <html> 标签产生的 “根层叠上下文”

总结

  • 层叠上下文是浏览器用来组织元素 Z 轴方向堆叠顺序的一个独立的 “视觉区域” 或 “作用域”
  • 层叠水平决定了同一层叠上下文内的元素谁在上、谁在下
  • 层叠上下文和层叠顺序这两个是概念,而层叠顺序是指当多个元素在 Z 轴方向发生重叠时,浏览器决定哪些元素显示在上、哪些元素被遮挡的一套规则
  • 在遇到需要判断多个元素重叠时,可以参考层叠准则中的流程图来判断谁在上,谁在下
  • 创建层叠上下文的方式有很多,并非只有定位元素 + z-index 可以创建

参考文章

  • 彻底搞懂CSS层叠上下文、层叠等级、层叠顺序、z-index最近,在项目中遇到一个关于CSS中元素z-index属性的问 - 掘金
  • 深入理解CSS中的层叠上下文和层叠顺序 « 张鑫旭-鑫空间-鑫生活

博客地址:https://github.com/wjw020206/blog


http://www.hkcw.cn/article/JfoCjlQUDu.shtml

相关文章

Python实现P-PSO优化算法优化BP神经网络回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在当今数据驱动的时代&#xff0c;回归分析作为预测和建模的重要工具&#xff0c;在科学研究和工业应用中占据着重要…

07.概念三:LayerNorm和Softmax

参考视频&#xff1a;LayerNorm和Softmax概念 那我们第三部分的概念&#xff0c;也就是概念的最后一部分 关于LayerNorm和Softmax的概念、以及最后文字是怎么预测出来的 我们先来看一下这个layer normalization&#xff0c;简称layer norm层归一化。我觉得叫数字缩放&#xff0…

sglang0.4.3参数说明

执行命令&#xff1a; Python3 -m sglang.launch_server --model-path /mnt/data/models/DeepSeek-R1-Distill-Qwen-32B --host 172.26.*.* --port 9300 --tp 4 --trust-remote-code --served-model-name qwen32b 运行结果 响应速度 参数说明 model_path: 模型文件…

DeepSeek-R1-0528,官方的端午节特别献礼

DeepSeek&#xff1a;端午安康&#xff01;刻在国人骨子里的浪漫 2025 年 05 月 28 日 | DeepSeek 端午特别献礼 当粽叶飘香时&#xff0c;DeepSeek 悄然带来一份节日惊喜 版本号 DeepSeek-R1-0528 正式上线 官方赋予它的灵魂是&#xff1a; 思考更深 推理更强 用户通过官网…

莫雷加德说很荣幸成为樊振东队友 共同征战TTBL

当地时间5月31日,萨尔布吕肯乒乓球俱乐部宣布,乒乓球大满贯选手、巴黎奥运会乒乓球男单金牌得主樊振东将在下个赛季代表俱乐部参加德国乒乓球甲级联赛(TTBL)。目前效力于萨尔布吕肯俱乐部的乒乓球运动员、巴黎奥运会乒乓球男单银牌得主莫雷加德在社交媒体上表达了欢迎之情,…

人民日报:有车企说反内卷却打价格战 行业协会与工信部齐发声反对

中国汽车工业协会发布《关于维护公平竞争秩序,促进行业健康发展的倡议》,明确表示反对近期车企掀起的新一轮“价格战”。工信部也表态支持该倡议,强调“价格战”没有赢家。这一信号和态度有助于及时遏制无序的价格竞争。近年来,一些车企虽然口头上反对“内卷式”竞争,但实…

深入剖析Java类加载机制:双亲委派模型的突破与实战应用

引言&#xff1a;一个诡异的NoClassDefFoundError 某金融系统在迁移到微服务架构后&#xff0c;突然出现了一个诡异问题&#xff1a;在调用核心交易模块时&#xff0c;频繁抛出NoClassDefFoundError&#xff0c;但类明明存在于classpath中。经过排查&#xff0c;发现是由于不同…

在屈原的家乡端午节是什么样 三次端午持续近一月

端午节作为中国最古老的节日之一,其中以纪念屈原的习俗影响最为广泛。屈原出生于战国时期的湖北秭归,这里不仅保留着典型的屈原故里端午习俗,还有“端午比年大”的说法。在屈原的家乡湖北秭归乐平里,四面群山环抱,不远处是长江支流香溪河。据古籍记载,秭归“县北一百六十…

两条大鲵觅食迷路 警民接力救助 携手护送“水中熊猫”

5月29日10时许,湖北省襄阳市保康县的李先生和朋友在后坪镇五道峡附近的小河钓鱼时,意外发现了两条娃娃鱼。考虑到它们是野生保护动物,李先生立即报警求助。十分钟后,保康县公安局后坪派出所民警赶到现场。李先生激动地告诉民警:“我一看像是‘娃娃鱼’,就赶紧报了警,还是…

梨形身材是基因彩票 更长寿的体型密码

身材与健康息息相关,涉及体能、代谢和疾病风险等多个方面。科学家认为,“细腰肥臀”的梨型身材患代谢相关慢性病的风险较低,寿命更长。近日,“梨形身材是基因彩票”的话题在社交平台引发热议。研究发现,大腿粗、臀部大的“梨形身材”可能比肚子大的人长寿。《欧洲心脏杂志…

STL之vector

1 vector初识 1 动态扩展 并不是在原有的空间里面之后续接新的空间&#xff0c;而是找更到的空间&#xff0c;然后将原有的数据拷贝到新的空间&#xff0c;释放原有空间 vector容器的迭代器是支持随机访问的迭代器 2 功能描述和函数原型 //默认构造 vector<int> v1;f…

巴黎圣日耳曼5比0国际米兰 创造队史新篇章

当地时间5月31日晚,2024-2025赛季欧洲冠军联赛决赛在德国慕尼黑落幕。巴黎圣日耳曼以5比0战胜国际米兰,首次夺得欧冠奖杯,书写了队史新篇章。这是巴黎圣日耳曼第三次闯入欧冠决赛,前两次均未能夺冠。此次胜利使巴黎圣日耳曼实现了赛季三冠王的壮举,包括法甲、法国杯和欧冠…

《高级架构师》------- 考后感想

笔者来聊一下架构师考后的感想 复习备考 考前过了很多知识点&#xff0c;只是蜻蜓点水&#xff0c;没有起到复习的作用&#xff0c;即使考出来也不会&#xff0c;下次复习注意这个&#xff0c;复习到了&#xff0c;就记住&#xff0c;或者画出来&#xff0c;或者文件总结&…

Python实现P-PSO优化算法优化Catboost分类模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着机器学习技术的快速发展&#xff0c;分类问题在金融风控、医疗诊断、推荐系统等领域的重要性日益凸显。CatBoost…

中使馆驳斥马克龙将台湾类比乌克兰 本质区别不可比

当地时间5月31日,法国总统马克龙在香格里拉对话会上表示,如果允许俄罗斯不受约束地占领乌克兰的任何部分,那么台湾也可能面临类似情况。对此,中国驻新加坡大使馆在社交平台脸书上回应称,将台湾问题与乌克兰问题相提并论是不可接受的。中国驻新加坡大使馆指出,台湾问题与乌…

步行者时隔25年第2次总决赛战雷霆 决战在即

北京时间6月1日上午,NBA东部决赛进行了第6场比赛,印第安纳步行者在主场以125比108击败纽约尼克斯,最终以4比2的大比分晋级NBA总决赛。他们的对手将是雷霆队。这是步行者自1999-2000赛季以来首次闯入NBA总决赛。比赛过程中,上半场双方比分紧咬。第三节比赛中,步行者逐渐发力…

如何解读印度宣布将自研隐形战斗机 挑战与前景

印度国防部宣布启动国产隐形战斗机的研制项目,标志着印度在自研和进口隐形战斗机之间做出了选择。隐形战斗机的研制难度极大,全球仅有少数国家具备此能力。外界对印度是否具备自主研发隐形战斗机的能力表示关注。印度防长辛格批准了一项建造先进中型隐形战斗机(AMCA)的框架…

姆巴佩祝贺巴黎夺冠 荣光属于整个俱乐部

北京时间6月1日凌晨,2024-2025赛季欧冠决赛落幕。巴黎圣日耳曼在最终决战中表现出色,上半场杜埃一传一射帮助球队以2-0领先,下半场杜埃完成梅开二度,科瓦拉茨赫利亚单刀扩大比分,马尤卢锁定胜局,最终巴黎圣日耳曼以5-0战胜国际米兰,首次夺得欧冠奖杯。赛后姆巴佩发文祝贺…

巴黎夺得欧冠冠军 创决赛最大分差纪录

北京时间6月1日,欧冠决赛在安联球场举行,巴黎圣日耳曼对阵国际米兰。上半场阿什拉夫破门,19岁的杜埃贡献一传一射。下半场杜埃再入一球,克瓦拉茨赫利亚锁定胜局,马尤卢替补登场后也取得进球,登贝莱则送出两次助攻。最终,巴黎圣日耳曼以5-0大胜国际米兰,创造了欧冠决赛的…

雷军:诋毁 本身就是一种仰望 小米汽车备受期待

6月1日,雷军在微博上宣布,2025年5月小米SU7的交付量将超过28,000台。他表示,公司正在全力为小米YU7的大规模量产做准备,预计7月份开始量产。同一天,小米集团总裁卢伟冰也在微博上表示,无论是SU7的热销还是YU7获得更高的关注和期待,都基于强大的产品力。他强调,小米汽车…