關於z-index的那些事兒

2020-12-14 站長之家

關於z-index的真正問題是,很少有人理解它到底是怎麼用。其實它並不複雜,但是如果你從來沒有花一定時間去看具體的z-index相關文檔,那麼你很可能會忽略一些重要的信息。

不相信我嗎?好吧,看看你能否解決下面這個問題:

問題:

在 接下來的HTML裡有三個<div>元素,並且每個<div>裡包含一個<span>元素。每 個<span>被分別給定一個背景顏色:紅、綠、藍。每個<span>被放置到文檔的左上角附近,部分重疊著其他 的<span>元素,這樣你就可以看到哪些是被堆疊在前面。第一個<span>有一個z-index的值為1,而其他兩個沒有任 何z-index值。

以下就是這個HTML和它的基本CSS。

HTML代碼

<div>

<span class=「red」>Red</span>

</div>

<div>

<span class=「green」>Green</span>

</div>

<div>

<span class=「blue」>Blue</span>

</div>

CSS代碼

.red, .green, .blue {

position: absolute;

}

.red {

background: red;

z-index: 1;

}

.green {

background: green;

}

.blue {

background: blue;

}

在線調試

挑戰:

嘗試使紅色<span>元素堆在藍色和綠色<span>的後面,不要打破以下規則:

不要以任何方式改變HTML標記

不要添加/修改任何元素的z-index屬性

不要添加/修改任何元素的position屬性

如果你找到了答案,那麼它應該像下面這樣:

<div>

<span class=「red」>Red</span>

</div>

<div>

<span class=「green」>Green</span>

</div>

<div>

<span class=「blue」>Blue</span>

</div>

div:first-child {

opacity: .99;

}

.red, .green, .blue {

position: absolute;

}

.red {

background: red;

z-index: 1;

}

.green {

background: green;

}

.blue {

background: blue;

}

在線調試

解決方案:

這個解決方法是在第一個<div>裡(紅色<span>的父節點)添加一個小於1的opacity屬性值。下面就是被添加的CSS的例子:

div:first-child {

opacity: .99;

}

如果你現在很震驚,但是仍然百思不得其解,並且不相信opacity能決定哪個元素堆在前面,歡迎來社區提問,當第一次在這個問題上被困擾時我同樣很震驚。

希望接下來的內容能夠讓你對這個問題更清楚些。

堆棧順序

Z-index看上去如此簡單:高的z-index堆在低的z-index的前面,對嗎?這實際上是錯的,是z-index問題的一部分。它看上去如此的簡單,以至於很多開發者沒有花相應的時間去讀相關的規則。

每一個在HTML文檔中的元素既可以在其他元素的前面,也可以在其他元素的後面。這就是所謂的堆棧順序。決定這個順序的規則被十分清楚的定義在說明文檔中,但是就像之前我已經提到過,這些文檔沒有被大多數開發者們完全弄明白。

當z-index和position屬性不被包括在內時,這些規則相當簡單:基本上,堆棧順序和元素在HTML中出現的順序一樣。(好吧,其實是有一點複雜的,但是只要你不使用壓縮邊界來重疊行內元素,你可能不會遇到邊界問題。)

當你把位置屬性也包括在內介紹時,任何定位元素(和他們的子元素)都在非定位元素前被顯示出來。(說一個元素被「定位」意思是它有一個不同於靜態的位置值,例如相對的,絕對的,等等。)

最 後,當z-index被提及時,事情變的有點兒複雜。最初,很自然的假設帶有高z-index值的元素會在帶有低z-index值的元素前面,但是後來發 現沒那麼簡單。首先,z-index只對定位元素起作用。如果你嘗試對非定位元素設定一個z-index值,那麼肯定不起作用。其次,z-index值能 創建堆棧上下文環境,並且突然發現看似簡單的東西變的更加複雜了。

堆棧上下文

一組具有共同雙親的元素,按照堆棧順序一起向前或向後移動構成了所謂的堆棧上下文。充分理解堆棧上下文是真正掌握z-index和堆棧順序工作原理的關鍵。

每 一個堆棧上下文都有一個HTML元素作為它的根元素。當一個新的堆棧上下文在一個元素上形成,那麼這個堆棧上下文會限制所有的子元素以堆棧的順序存儲在一 個特別的地方。那意味著一旦一個元素被包含在處於底部堆棧順序的堆棧上下文中,那麼就沒有辦法先出現於其他處於更高的堆棧順序的不同堆棧上下文元素,就算 z-index值是十億也不行!

現在,堆棧上下文有三種方法可以在一個元素上形成:

當一個元素是文檔的根元素時(<html>元素)

當一個元素有一個position值而不是static,有一個z-index值而不是auto

當一個元素有一個opacity值小於1

前兩種形成堆棧上下文的方法具有很大意義並且被廣大Web開發者所理解(即使他們不知道這些被叫做什麼)。第三種方法(opacity)幾乎從來沒在w3c說明文檔之外被提及過。

用堆棧順序決定一個元素的位置

實際上,為一個頁面上的所有元素決定全局堆棧順序(包括邊界、背景、文本節點、等等)是極度複雜的,並且遠遠超越了本文講述的範圍(再一次,參考文檔)。但是我們最大的目的,就是基本了解這個順序,它能夠在很長一段時間內幫助我們提高CSS開發的可預測性。所以,讓我們打破順序,分解為獨立的堆棧上下文。

在同樣的堆棧上下文裡的堆棧順序

下面是幾條基本的規則,來決定在一個單獨的堆棧上下文裡的堆棧順序(從後向前):

堆棧上下文的根元素

定位元素(和他們的子元素)帶著負數的z-index值(高的值被堆疊在低值的前面;相同值的元素按照在HTML中出現的順序堆疊)

非定位元素(按照在HTML中出現的順序排序)

定位元素(和他們的子元素)帶著auto的z-index值(按照在HTML中出現的順序排序)

定位元素(和他們的子元素)帶著正z-index值(高的值被堆疊在低值的前面;相同值的元素按照在HTML中出現的順序堆疊)

注 解:定位元素帶有負的z-index值被在一個堆棧上下文中先排序,這意味著他們出現在所有其他元素的後面。正因如此,它使一個元素出現在自己父元素之後 成為可能,這以前通常是不可能的事。當然,這局限於它的父元素與它在同一個堆棧上下文,並且不是那個堆棧上下文的根元素。一個偉大的例子如Nicolas Gallagher的CSS不用圖像降低陰影。

全局堆棧順序

堅定的理解了為什麼/什麼時候新的堆棧上下文形成,同時掌握了同一個堆棧上下文的堆棧順序,現在讓你來找出一個特定元素將出現在全局堆棧裡的順序不是那麼糟糕了吧?

避免錯誤的關鍵是能夠發現新的堆棧上下文什麼時候形成。如果你對一個元素設置了z-index值為十億但是它沒有在堆棧順序中向前移動,檢查一下它的祖先樹,看是否它的父節點形成了堆棧上下文。如果是那樣的話,你的z-index值即使有十億也不會給你帶來好處。

包紮救治

回到之前的原始問題,我已經重建了這個HTML的結構,添加了一些注釋,每一個標籤指明了它在堆棧裡的順序。這個順序是假設最初的CSS。

<div><!-- 1 -->

<span class=「red」><!-- 6 --></span>

</div>

<div><!-- 2 -->

<span class=「green」><!-- 4 --><span>

</div>

<div><!-- 3 -->

<span class=「blue」><!-- 5 --></span>

</div>

當我們添加opacity到第一個<div>,堆棧順序像下面這樣改變:

<div><!-- 1 -->

<span class=「red」><!-- 1.1 --></span>

</div>

<div><!-- 2 -->

<span class=「green」><!-- 4 --><span>

</div>

<div><!-- 3 -->

<span class=「blue」><!-- 5 --></span>

</div>

span.red曾經的順序是6,但現在改為1.1。我已經使用「。」來標註一個新的上下文環境的形成。span.red現在是那個新的上下文的第一個元素。

現 在似乎更清晰了,關於為什麼紅色盒子跑到其他盒子的後面。原始的例子只包含兩個堆棧上下文,根元素和形成span.red的那個。當我們添加 opacity到span.red的父節點上,形成了第三個堆棧上下文,結果顯示在span.red上的z-index值只能應用在那個新的堆棧上下文 中。因為第一個<div>(應用opacity的那個)和它的兄弟元素沒有position或者z-index值的集合,他們的堆棧順序是由 他們在HTML裡的源順序決定的,也就是說第一個<div>,和它的堆棧上下文裡的所有元素被第二個和第三個<div>元素分 離。

via gbtags

來源:關於z-index的那些事兒

相關焦點

  • 不用z-index逆向疊加的方法
    正文開始在大漠的朋友圈裡發的內容是這樣說的:今天一絲姐姐面試我,這個效果不用z-index怎麼做出來!想的我蛋疼題目的大圖是這樣的:但又不能使用 z-index,就算是使用 z-index 的話,還要考慮給每個不同的 div 元素增加不同的值來實現,這樣顯然不能滿足要求啊。不過在 CSS 中還有一個東西是會影響元素的層疊效果,影響 position: absolute;  之類的定位操作的。既然這個東西可以影響層疊效果,那麼不就是可以利用這玩意來實現層疊效果麼。
  • z-index和transform
    第二個div做了一個margin-top的-50px,可以看到第二個div遮住了第一個div。那麼怎麼才能改變默認的堆疊順序呢?先把結論給大家拋出來,在CSS中可以使用z-index和transform可以改變元素的堆疊順序。但也可能會導致一些奇怪的情況,比如具有較大的z-index的元素並不總是位於具有較低z-index元素的上方。
  • 【第73期】沒人告訴你關於z-index的一些事
    關於z-index的問題是很多程式設計師都不知道它是如何起作用的。說起來不難,但是大部分人並沒有花時間去看規範,這往往會照成嚴重的後果。
  • 一篇文章帶你了解css z-index(重疊順序)
    層重疊順序div層、span層等html標籤層重疊順序樣式z-index,平時CSS使用較少,但也會難免會碰到CSS z-index使用。注意:z-index的數值不跟單位。二、z-index使用條件z-index在使用絕對定位 position:absolute屬性條件下使用才能使用。通常CSS讓不同的對象盒子以不同順序重疊排列,CSS就是要z-index樣式屬性。
  • CSS 的「層」巒「疊」翠 - 一文掌握z-index用法​​​​​​​
    前言提起,z-index大家腦海裡可能會立刻浮現這樣的知識點:「z-index 的值大小控制元素在 Z 軸上顯示的層級,z-index 越大顯示的層級越高(也就是在最上層,離觀察者越近),沒有指定的按照出現順序堆疊,此外z-index不能跨父元素比較。
  • 徹底搞懂CSS層疊上下文、層疊等級、層疊順序、z-index
    前言最近,在項目中遇到一個關於 CSS 中元素z-index屬性的問題,具體問題不太好描述,總結起來就是當給元素和父元素色設置position屬性和z-index相關屬性後,頁面上渲染的元素層級結果和我預想的不一樣。根據自己之前的理解,也沒找到一個合理的解釋。我知道,肯定是我對相關屬性的細節理解存在問題,所以結合官方文檔和在網上各種搜集整理,明白了其中的原因。
  • css篇-面試題5-以下哪些設置可以使 z-index 生效?
    雖互不曾謀面,但希望能和您成為筆尖下的朋友以讀書,技術,生活為主,偶爾撒點雞湯不作,不敷衍,意在真誠吐露,用心分享點擊左上方,可關注本刊標星公眾號(ID:itclanCoder)如果不知道如何操作點擊這裡,標星不迷路━━━━━━以下哪些設置可以使 z-index
  • CSS中position定位和z-index屬性用法詳解
    你對CSS中的position定位和z-index屬性的用法是否了解,position屬性中static、absolute、relative三個參數,這裡和大家分享一下其用法。深入理解CSS中的position定位和z-index屬性由於平時不太用到,所以過去寫CSS的時候對於position屬性的absolute、relative值理解比較模糊,對於z-index的層疊更是摸不著頭腦,除了理解的因素外,各個瀏覽器的不同解析結果也是一個大問題。
  • CSS樣式更改——裁剪、Z-Index、清除、改變元素的特性
    23px,14px,45px,54px)}rect (top, right, bottom, left) 設置元素的形狀auto 不應用任何剪裁2.Z-Index設置元素的堆疊順序div{z-index
  • 關於備產的那些事兒
    最近有不少準媽媽發來私信問,備產的一些注意事項,所以今天就好好的說一說關於《準媽媽必看!關於備產的那些事兒》,希望可以更好的幫助到各位準媽媽!很多寶媽快到臨產的時候各種糾結,到底是順產好?剖腹產好?關於備產的那些事兒準媽媽必看!
  • 關於平面設計的那些事兒~
    關於平面設計的那些事兒經常聽到很多人說,平面設計很簡單,學好PS就可以了;平面設計太簡單了,沒什麼技術含量,工資也不高之類的話。關於平面設計師,百度百科是這麼定義的:關於平面設計的那些事兒平面設計是在二維的平面上進行的創造性活動,在平面的媒介上完成信息傳達過程、宣傳商品和表現創意,通過精美的圖形、版式和色彩傳達給觀眾,創造出引人入勝的視覺效果
  • 關於《明朝那些事兒》
    昨晚,終於看完了《明朝那些事兒》的最後一部。整套書加起來接近250萬字左右,這是我近幾年讀的比較長的一部書了。
  • 畢業生之-檔案那些事兒
    針對以上問題,是不是讓你頭疼了,別擔心,人社部已經為大家整理好相關資料,圖解檔案那些事兒。連結:http://www.mohrss.gov.cn/SYrlzyhshbzb/zcfg/SYzhengcejiedu/202007/t20200715_379475.html
  • 語言趣談:英語裡關於「顏色」的那些事兒
    前面分享了一篇文章,關於「白色」在英語裡的不同表達,其實除了白色,有些顏色在英語裡的表達也是「令人意外」,下面來看看英語裡關於「顏色」的那些事兒吧!hai r關於英語裡的顏色,還有很多有趣的事情,somebody is in + color表示「某人穿……顏色的衣服」,但是,somebody/something is in the
  • 關於葡萄籽油的那些事兒
    關於葡萄籽油的那些事兒!說到葡萄大家都忍不住吞了口水了,葡萄是很多人愛吃的水果,它可以給我們的身體帶來營養,多吃葡萄對皮膚來說是非常好的,還有我們前面提到的葡萄乾。但是我們今天要講的是葡萄的另外一部分,那就是葡萄籽油。
  • 幼兒學拼音09:平翹舌聲母跟單韻母組合的那些事兒
    本講我們來說說翹舌聲母zh、ch、sh、r和平舌聲母z、c、s跟單韻母組合的那些事兒。通過下面的表格,可以很清晰地看出它們的組合情況。下面結合這個表格,分別解釋一下。3、單韻母o不能跟zh、ch、sh、r、z、c、s組合在一起拼讀嗎?
  • 關於成考,你不知道的那些事兒
    那麼,今天小K老師是就來嘮嘮關於成考畢業文憑那些事兒。
  • 網絡安全普法校園行 告訴孩子關於網絡安全那些事兒
    原標題:【全民國家安全教育日】#網絡安全普法校園行#告訴孩子關於網絡安全那些事兒國家安全關乎國家核心利益,維護國家安全人人有責。近日,上海公安局網絡安全總隊研導科民警走進彭浦實驗小學,面向300名小學生開展網絡安全普法教育,告訴學生們關於「網絡安全那些事兒」。「不隨便透露自己的個人信息」「不隨意打開不明網絡連結」.......
  • 觀點│關於籤約反悔那些事兒
    今天小編就帶大家來聊聊關於籤約反悔那些事兒。——編者記張同學16年參加3、4月份自招考試,先後被se和qb中學預錄,由於之前和se已經籤約,考慮再三決定毀約,逐電聯se招生辦告知情況並成功與qb籤約。這個問題是家長最關心的。具體怎麼操作。首先,從純技術層面,只要5月的全市統一網籤沒有塵埃落定,原則上都是可以毀約的。
  • 「小姐姐」講民法典 | 關於肖像權那些事兒~
    所分享內容為作者個人觀點,僅供讀者學習參考,不代表本號觀點經常有新聞報導明星維權的事兒比如自己的肖像權被某某商家侵犯了可是,你了解肖像權嗎? 帶著這幾個問題「小姐姐」給大家說說關於肖像權的那些事兒