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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85440.shtml
英文地址,請注明出處:http://en.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…