CSS专题之层叠上下文

前言

石匠敲击石头的第 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.pswp.cn/diannao/85440.shtml

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

相关文章

RabbitMQ集群与负载均衡实战指南

文章目录 集群架构概述仲裁队列的使用1. 使用Spring框架代码创建2. 使用amqp-client创建3. 使用管理平台创建 负载均衡引入HAProxy 负载均衡&#xff1a;使用方法1. 修改配置文件2. 声明队列 test_cluster3. 发送消息 集群架构 概述 RabbitMQ支持部署多个结点&#xff0c;每个…

Prometheus + Grafana + Cadvisor:构建高效企业级服务监控体系

在现代软件开发和运维领域&#xff0c;容器化技术的应用越来越广泛&#xff0c;其中 Docker 作为最受欢迎的容器化解决方案之一&#xff0c;其容器的监控管理变得至关重要。本文将详细介绍如何使用 cadvisor、Prometheus 和 Grafana 来监控 Docker 容器的状态。 一、安装镜像 …

小提琴图绘制-Graph prism

在 GraphPad Prism 中为小提琴图添加显著性标记(如*P<0.05)的步骤如下: 步骤1:完成统计检验 选择数据表:确保数据已按分组排列(如A列=Group1,B列=Group2)。执行统计检验: 点击工具栏 Analyze → Column analyses → Mann-Whitney test(非参数检验,适用于非正态数…

【开源工具】跳过网页APP禁止粘贴限制:自动输入键盘模拟工具

&#x1f4cc; 【黑科技】跳过网页APP禁止粘贴限制&#xff1a;自动输入键盘模拟工具 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热情源自每一…

深度学习篇---face-recognition的优劣点

face_recognition库是一个基于 Python 的开源人脸识别工具&#xff0c;封装了 dlib 库的深度学习模型&#xff0c;具有易用性高、集成度强的特点。以下从技术实现、应用场景等维度分析其优劣势&#xff1a; 一、核心优势 1. 极简 API 设计&#xff0c;开发效率极高 代码量少…

Git深入解析功能逻辑与核心业务场景流程

一、Git核心功能逻辑架构 #mermaid-svg-9tj1iCr99u6QenJM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9tj1iCr99u6QenJM .error-icon{fill:#552222;}#mermaid-svg-9tj1iCr99u6QenJM .error-text{fill:#552222;st…

【大模型】情绪对话模型项目研发

一、使用框架&#xff1a; Qwen大模型后端Open-webui前端实现使用LLamaFactory的STF微调数据集&#xff0c;vllm后端部署&#xff0c; 二、框架安装 下载千问大模型 安装魔塔社区库文件 pip install modelscope Download.py 内容 from modelscope import snapshot_downlo…

Java基础 Day26

一、网络编程简介 1、概念 网络编程指在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行数据传输 2、软件架构 &#xff08;1&#xff09;CS架构&#xff08;客户端和服务端&#xff09; 在用户本地有一个客户端程序&#xff0c;在远程有一个服务器端程…

【Hot 100】45. 跳跃游戏 II

目录 引言跳跃游戏 IIdp解题贪心解题 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;【Hot 100】45. 跳跃游戏 II❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01; 引言 跳跃…

计算机网络第1章(上):网络组成与三种交换方式全解析

目录 一、计算机网络的概念二、计算机网络的组成和功能2.1 计算机网络的组成2.2 计算机网络的功能 三、电路交换、报文交换、分组交换3.1 电路交换&#xff08;Circuit Switching&#xff09;3.2 报文交换&#xff08;Message Switching&#xff09;3.3 分组交换&#xff08;Pa…

[总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析

前端性能分析大全 前端性能优化 LightHouse性能评分 性能指标监控分析 浏览器加载资源的全过程性能指标分析 性能指标 在实现性能监控前&#xff0c;先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系&#xff0c;旨在帮助开发者量…

Windows商店中的免费扫雷游戏应用

《扫雷》是一款经典的单人益智小游戏&#xff0c;1992年微软发布的Windows 3.1中加入该游戏&#xff0c;从此风靡全世界。游戏目标是通过逻辑推理&#xff0c;在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷。 此Windows应用实现了经典扫雷的…

ActiveMQ 可观测性最佳实践

ActiveMQ 介绍 ActiveMQ 是一款高性能、开源的消息中间件&#xff0c;支持多种消息协议&#xff08;如 JMS、AMQP、MQTT 等&#xff09;&#xff0c;能够实现应用程序之间的异步通信和消息传递。它提供点对点&#xff08;Queue&#xff09;和发布/订阅&#xff08;Topic&#…

【Linux命令】scp远程拷贝

文章目录 1. 基本语法与常用选项2. 使用场景和使用示例本地文件->远程主机远程主机文件->本地远程主机->另一台远程主机 3. 使用注意事项 scp&#xff08;Secure Copy Protocol&#xff09;是linux中基于ssh的安全文件传输工具&#xff0c;用于在本地和远程主机之前安…

如何优化 Harmony-Cordova 应用的性能?

以下是针对 ‌Harmony-Cordova 应用性能优化‌的完整方案&#xff0c;结合鸿蒙原生特性和Cordova框架优化策略&#xff1a; ‌⚡一、渲染性能优化‌ ‌减少布局嵌套层级‌ 使用扁平化布局&#xff08;如 Grid、GridRow&#xff09;替代多层 Column/Row 嵌套&#xff0c;避免冗…

c++学习之---模版

目录 一、函数模板&#xff1a; 1、基本定义格式&#xff1a; 2、模版函数的优先匹配原则&#xff1a; 二、类模板&#xff1a; 1、基本定义格式&#xff1a; 2、类模版的优先匹配原则&#xff08;有坑哦&#xff09;&#xff1a; 3、缺省值的设置&#xff1a; 4、ty…

SpringAI(GA):RAG下的ETL快速上手

原文链接&#xff1a;SpringAI(GA)&#xff1a;RAG下的ETL快速上手 教程说明 说明&#xff1a;本教程将采用2025年5月20日正式的GA版&#xff0c;给出如下内容 核心功能模块的快速上手教程核心功能模块的源码级解读Spring ai alibaba增强的快速上手教程 源码级解读 版本&a…

用dayjs解析时间戳,我被提了bug

引言 前几天开发中突然接到测试提的一个 Bug&#xff0c;说我的时间组件显示异常。 我很诧异&#xff0c;这里初始化数据是后端返回的&#xff0c;我什么也没改&#xff0c;这bug提给我干啥。我去问后端&#xff1a;“这数据是不是有问题&#xff1f;”。后端答&#xff1a;“…

DataAgent产品经理(数据智能方向)

DataAgent产品经理&#xff08;数据智能方向&#xff09; 一、核心岗位职责 AI智能体解决方案设计 面向工业/政务场景构建「数据-模型-交互」闭环&#xff0c;需整合多源异构数据&#xff08;如传感器数据、业务系统日志&#xff09;与AI能力&#xff08;如大模型微调、知识图…

Ubuntu取消开机用户自动登录

注&#xff1a;配置前请先设置登录密码&#xff0c;不同显示管理器配置方法不同&#xff0c;可用命令查看&#xff1a;cat /etc/X11/default-display-manager 一、LightDM 显示管理器&#xff0c;关闭 Ubuntu 系统用户自动登录 查找自动登录配置文件&#xff0c;可以看到类似 a…