【CSS in Depth 2 精译_041】6.4 CSS 中的堆叠上下文与 z-index(上)
当前内容所在位置(可进入专栏查看其他译好的章节内容)
- 第一章 层叠、优先级与继承(已完结)
- 第二章 相对单位(已完结)
- 第三章 文档流与盒模型(已完结)
- 第四章 Flexbox 布局(已完结)
- 第五章 网格布局(已完结)
- 【第六章 定位与堆叠上下文】 ✔️
- 6.1 固定定位
- 6.1.1 创建一个固定定位的模态对话框
- 6.1.2 在模态对话框打开时防止屏幕滚动
- 6.1.3 控制定位元素的大小
- 6.2 绝对定位
- 6.2.1 关闭按钮的绝对定位
- 6.2.2 伪元素的定位问题
- 6.3 相对定位
- 6.3.1 创建下拉菜单(上)
- 6.3.2 创建 CSS 三角形(下)
- 6.4 堆叠上下文与 z-index ✔️
- 6.4.1 理解渲染过程与堆叠顺序(上) ✔️
- 6.4.2 用 z-index 控制堆叠顺序(上) ✔️
- 6.4.3 深入理解堆叠上下文(下)(精译中 ⏳)
文章目录
- 6.4 堆叠上下文与 z-index(Stacking contexts and z-index)
- 6.4.1 理解渲染过程与堆叠顺序 Understanding the rendering process and stacking order
- 6.4.2 用 z-index 控制堆叠顺序 Manipulating stacking order with z-index

《CSS in Depth》新版封面
译者按
前面利用 CSS 的定位技术相继实现了模态对话框和下拉菜单的效果,这一节将重点处理二者在页面渲染时出现的意外堆叠问题。本节内容非常重要,由于篇幅较长,特地分为上篇和下篇进行介绍。本篇为上篇,先讲讲堆叠问题的具体处理。下一篇再深入原理,彻底弄清堆叠上下文的核心概念及行为模式。其实阻碍前端开发人员进阶中高级水平的,往往就是这些平时就掌握得模棱两可的核心概念,即便工作中遇到过,事后也鲜有及时复盘与梳理。让我们跟随作者的脚步,一起持续深耕,潜心积累!
6.4 堆叠上下文与 z-index(Stacking contexts and z-index)
定位技术(Positioning)固然实用,但更重要的是弄明白它会带来什么样的意外情况。一个元素自从脱离文档流后,之前由文档流负责的工作从此也将由您来全面接管。
比如,要时刻确保该元素不会意外跑到浏览器视口(viewport)的外面,让用户找不着它;其次,必须保证该元素不会意外挡住页面上的重要内容。
最后还要考虑元素堆叠(stacking)方面的问题。在同一页面定位多个元素时,很可能会遇到两个不同的定位元素发生重叠的情况,并且偶尔还会发现它们并没有乖乖按照我们预想的方式进行重叠。其实本章的示例已经有意设置了这样的问题场景,以便进一步演示该如何处理。
根据之前示例页面的设计需求,点击页面顶部的注册按钮(即 “Sign up” 字样的按钮)就能打开一个模态对话框。要是把下拉菜单相关的 HTML 标记放到模态框的源码后面,最终效果就会如下图 6.10 所示,下拉菜单意外挡在了模态对话框的前面:

图 6.10 模态框错误地出现在下拉菜单的后面
解决这个问题有很多种方案。在此之前,有必要先了解一下浏览器确定元素堆叠顺序的基本原理。为此,需要进一步考察一个页面在浏览器中的渲染过程。
6.4.1 理解渲染过程与堆叠顺序 Understanding the rendering process and stacking order
在浏览器将 HTML 解析为 DOM 时,它还会同步创建一个新的树形结构,称为 渲染树(render tree)。该渲染树不仅体现了每个元素的视觉样式和位置,同时也决定着浏览器 绘制(paint) 这些元素的顺序。该顺序 极其重要:一旦发生重叠,后绘制的元素就会出现在先绘制的元素上。
通常情况下(即使用 CSS 定位前),该绘制顺序由元素在 HTML 中出现的源码顺序决定。以如下 HTML 标记的这三个元素为例:
<div>one</div>
<div>two</div>
<div>three</div>
它们相互间的堆叠行为将如图 6.11 所示。这里使用了负的外边距来让元素重叠,但并没有设置任何定位。可以看到,源码位置靠后的元素绘制在了位置靠前的元素上:

图 6.11 正常情况下三个元素的堆叠效果
而设置定位后,情况就不同了。浏览器会优先绘制所有未被定位的元素(non-positioned elements),然后再绘制已定位的元素。默认情况下,已定位的所有元素都会出现在尚未定位的元素前面(to the front)。如图 6.12 所示,给前两个元素加上 position: relative 后,它们就绘制到前面去了,覆盖了静态定位下的第三个元素,尽管元素在 HTML 中的源码顺序并未改变。
注意,在定位的这两个元素中,第二个元素还是绘制在了第一个元素的前面。虽然定位元素都被放到了前面,但它们之间基于源码的重叠关系仍旧不变。

图 6.12 已定位的元素绘制在了静态元素的前面
也就是说,此时的示例页中,模态框和下拉菜单都会出现在静态内容之前(符合预期),但源码里后出现的元素还是会绘制到先出现的元素前面。要解决这个问题,有一种方案是将 <div class="modal"> 及其所有内容全部移动到下拉菜单 HTML 源码的后面。
通常情况下,模态框都会放到网页内容的最后,即 </body> 关闭标签的前面;大多数构建模态框的 JavaScript 库也会自动照这样处理。因为模态框用的是固定定位,所以无论其 HTML 标记在哪儿,最终都会被定位到屏幕正中。
移动源码位置这招对于固定定位元素来讲倒是没啥影响,但要是换作相对定位元素或者绝对定位元素,这招就失灵了。因为相对定位元素依赖于文档流,而绝对定位元素依赖于它最近的那个祖先定位元素(译注:即 containing block 包含块。详见 6.2 节内容)。这就需要我们另辟蹊径来控制此类元素的堆叠行为。于是就轮到 CSS 中的 z-index 属性闪亮登场了!
6.4.2 用 z-index 控制堆叠顺序 Manipulating stacking order with z-index
z-index 属性的值可以为任意整数(正负数均可)。这里的 z 表示的是笛卡尔 X-Y-Z 坐标系(译注:即三维直角坐标系)里的深度方向。z-index 值较高的元素会出现在该值较低的元素的前面。属性值为负数的元素则会出现在静态元素后面。
使用 z-index 属性便是解决页面堆叠问题的第二种方案。该方案不要求修改 HTML 的结构,只需令元素 modal-backdrop 的 z-index 值为 1、且元素 modal-body 的 z-index 值为 2 即可(这样就确保了模态框的主体部分位于蒙层的前方)。根据代码清单 6.11 更新本地样式表:
代码清单 6.11 给模态框加上 z-index 使其出现在下拉菜单前面
.modal-backdrop {position: fixed;inset: 0;background-color: rgba(0 0 0 / 0.5);z-index: 1; /* 将模态框的蒙层置于未设置 z-index 的元素前方 */
}.modal-body {position: fixed;inset-block: 3em;inset-inline: 20%;padding: 2em 3em;background-color: white;overflow: auto;z-index: 2; /* 将模态框主体提到蒙层的前方 */
}
z-index 看似简单,使用时却有两个小陷阱(gotchas)务必要当心:一是 z-index 只对定位元素生效,无法控制静态元素的堆叠顺序;其二,一旦给定位元素设置了 z-index,就必然会牵涉到另一个核心概念,称之为 堆叠上下文(stacking context)。
(上篇完。由于篇幅较长,堆叠上下文的核心概念及其作用原理将在下篇中重点介绍,敬请关注)
关于《CSS in Depth》(中译本书名《深入解析 CSS》)
| 第 1 版 | 第 2 版 | |
|---|---|---|
| 读者评分 | 原版:4.7(亚马逊);中文版:9.3(豆瓣) | 原版:5.0(亚马逊);中文版:暂无,待出版 |
| 出版时间 | 原版:2018 年 3 月;中文版:2020 年 4 月 | 原版:2024 年 7 月;中文版:暂无,待出版 |
| 原价 | 原版:$44.99;中文版:¥139.00 | 原版:$59.99;中文版:暂无,待出版 |
| 现价 | 原版:$36.49;中文版:¥52.54 起步 | 原版:$52.09;中文版:暂无,待出版 |
| 原版国内预订 | 起步价 ¥461.00 | 起步价 ¥750.00 |
本专栏为该书第 2 版高分译文专栏,全网首发,精译精校,持续更新,计划今年内完成全书翻译,敬请期待!!!
相关文章:
【CSS in Depth 2 精译_041】6.4 CSS 中的堆叠上下文与 z-index(上)
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结)第二章 相对单位(已完结)第三章 文档流与盒模型(已完结)第四章 Flexbox 布局(已…...
uniapp微信小程序巧用跳转封装鉴权路由
1.这是封装的跳转方法: import store from "../stores/store";function Router(type, url, params) {const NoLoginPage [。。。。。];var queryString Object.keys(params).map((key) > ${key}${params[key]}).join("&");if (!NoLog…...
国外电商系统开发-运维系统开发
因项目运营环境在国外,所以必须将服务器选择国外,加上第一次运营国外项目。在两大趋势下,企业的运营方向必须通过大数据来分析及修正运营方向,加上后期服务器数量日益增多,如何有效的管理众多的服务器及验证运营方向&a…...
基于投影滤波算法的rick合成地震波滤波matlab仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 RICK合成地震波模型 4.2 投影滤波算法原理 5.完整工程文件 1.课题概述 基于投影滤波算法的rick合成地震波滤波matlab仿真。分别通过标准的滤波投影滤波以及卷积滤波投影滤波对合成地震剖面进行滤波…...
【艾思科蓝】机器学习框架终极指南:PyTorch vs TensorFlow vs Keras vs Scikit-learn
第十届建筑、土木与水利工程国际学术会议(ICACHE 2024)_艾思科蓝_学术一站式服务平台 更多学术会议请看:学术会议-学术交流征稿-学术会议在线-艾思科蓝 目录 引言 1. PyTorch PyTorch的特点 PyTorch的用例 PyTorch的安装 PyTorch代码示例 2. TensorFlow …...
招联金融秋招内推2025
【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…...
遮罩解决图片悬浮操作看不到的情况
未悬浮效果 悬浮效果 如果仅仅是添加绝对定位,那么遇到白色图片,就会看不到白色字体。通过遮罩(绝对定位透明度)就可以解决这个问题。 <script setup> </script><template><div class"box"><…...
IoT网关的主要功能有哪些?天拓四方
在数字化浪潮席卷全球的今天,物联网(IoT)技术凭借其独特的优势,逐渐在各个领域展现出强大的生命力。而IoT网关,作为连接物理世界与数字世界的桥梁,其在物联网体系中的作用愈发凸显。 一、数据聚合与预处理…...
继承实现单例模式的探索(一)
前言 之前看到朋友采用继承的方式来实现单例模式,觉得很厉害,随后自己去探索了一番,以前实现单例模式都是把代码内联到具体的类中,这使得工程中每次需要使用单例模式时,都采用拷贝的方式,增加了很多冗余代码…...
【代码实现】opencv 高斯模糊和pytorch 高斯模糊
wiki百科 Gaussian Blur,也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次。 opencv实现 opencv实现高斯滤波有两种方式, 1、是使用自带的cv2…...
python基础语法2
文章目录 1.顺序语句2.条件语句2.1 语法格式 3.缩进与代码块4.空语句 pass5.循环语句5.1 while循环5.2 for循环 5.3 continue与break 1.顺序语句 默认情况下,python的代码都是按照从上到下的顺序依次执行的。 print(hello ) print(world)结果一定是hello world。写…...
linux第一课:下载与安装
这是我的个人复习笔记,草稿箱字太多会卡就发这了,欢迎大家阅读。 Kali Linux,黑客必备神器。跟着我,带你从入门到入狱! 第一课,下载与安装。 第一步: 在官网下载Centos镜像:http…...
虚拟机添加共享文件夹后仍无法显示文件
参考: https://blog.csdn.net/Pretender_1205/article/details/134859089 进入/mnt/hgfs目录下执行 sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other/mnt/hgfs 是挂载点,也可以修改为其他挂载点-o allow_other表示允许其他用户(普通用户)访问共…...
OSPF协议
基础知识 OSPF:开放式最短路径优先协议 (无类别链路状态IGP动态协议) OSPF的特点: 1.OSPF将自治系统划分为逻辑上的区域,使用LSA来发布路由信息,并通过OSPF报文在区域内路由器之间交互建立链路状态数据库和路由表 2.支持等开销的负载均衡…...
行为设计模式 -观察者模式- JAVA
观察者模式 一.简介二. 案例2.1 抽象主题(Subject)2.2 具体主题(Concrete Subject)2.3 抽象观察者(Observer)2.4 具体观察者(Concrete Observer)2.5 测试 三. 结论3.1 优缺点3.2 使用…...
在阿里工作是一种什么体验?
很多人都对在阿里工作感到好奇,今天就来给大家分享一下在阿里工作是一种什么体验~ 首先,先来介绍一下阿里的职位等级划分标准。 简单来讲,阿里的职位等级可以认为是 P 序列和 M 序列,但目前 M 序列已经不太对中下层员工开放了&…...
828华为云征文|华为云Flexus云服务器X实例——uniapp功能开发、搭建股票系统选择用什么服务器比较好?
在二次开发、安装搭建股票系统时,选择华为云Flexus X服务器是一个值得考虑的优质选项。以下是一些具体的建议: 测试环境:Linux系统CentOS7.6、宝塔、PHP7.3、MySQL5.7,根目录public,伪静态thinkphp,开启ssl…...
电子电路元件器介绍与选型——晶振
一、晶振 在我们使用嘉立创的时候,经常会看到晶振接到两个电容,这两个电容毫无疑问是滤波的,整个晶振其实就是一个振荡器,但这个振荡器会将其他频率给过滤掉,只保留一个频率也就是晶振的标称频率。当然上面讲的很明显是…...
【IEEE PDF eXpress】格式不对
目录 一、问题二、解决方法 一、问题 word的文档,用IEEE PDF eXpress网站生成pdf后,提交论文出现错误: Document validation failed due to the following errors: Content exceeds IEEE template margins for its format (Page 1:Bottom).…...
OpenAI全新多模态内容审核模型上线:基于 GPT-4o,可检测文本和图像
在数字时代,内容安全问题愈发受到重视。9月26日,OpenAI 正式推出了一款全新的多模态内容审核模型,名为 “omni-moderation-latest”。 该模型基于最新的 GPT-4o 技术,能够准确地识别检测有害文本图像。这一更新将为开发者提供强大…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
