本文首發於政採雲前端團隊博客: CSS 層疊上下文(Stacking Context)
在網頁製做的過程當中,元素與元素之間的位置關係,在座標軸上通常可體現爲 X 軸、Y 軸和 Z 軸。對於 X 軸和 Y 軸的定位大多數開發都能比較直觀的搞清楚,而 Z 軸 則相對較爲模糊,或者說不能全面的理解Z軸的顯示邏輯。css
大多數人都知道可使用 position
屬性配合 z-index
屬性解決元素的 Z 軸顯示問題,對於更深層次的原理卻不太瞭解。本文主要介紹了層疊上下文、層疊等級、層疊順序等概念。目的就是爲了理清元素的 Z 軸顯示順序的內部邏輯。html
// 穿透父級容器的 z-index <!-- 100 * 100 的深藍色 Block --> <div class="block blue" style="position: relative; z-index: auto;"> <!-- 50 * 50 的紅色 Block --> <div class="small red" style="position: relative; z-index: -1;"></div> </div>
// 不能穿透父級容器的 z-index <!-- 100 * 100 的深藍色 Block --> <div class="block blue" style="position: relative; z-index: 0;"> <!-- 50 * 50 的紅色 Block --> <div class="small red" style="position: relative; z-index: -1;"></div> </div>
兩段代碼基本同樣,只有在深藍色盒子處有個 z-index
不一樣。當父級容器的 z-index
爲 auto
的時候,紅色盒子穿過了父級容器出如今了父級容器的背後(被父級容器遮擋住)。當父級容器的 z-index
爲 0
的時候,紅色盒子沒法穿過父級容器。前端
// 元素 Z 軸對比 <!-- 100 * 100 的深藍色盒子 --> <div class="block blue"> <div style="position:relative;z-index:auto;"> <!-- 50 * 50 的紅色盒子 --> <div class="small red" style="position:absolute; z-index:2;"></div> </div> <div style="position:relative;z-index:auto;"> <!-- 50 * 50 的灰色盒子 --> <div class="small yellow" style="position:absolute; z-index:1; top: 10px;"></div> </div> </div>
// 元素 Z 軸對比 <!-- 100 * 100 的深藍色盒子 --> <div class="block blue"> <div style="position:relative;z-index:0;"> <!-- 50 * 50 的紅色盒子 --> <div class="small red" style="position:absolute; z-index:2;"></div> </div> <div style="position:relative;z-index:0;"> <!-- 50 * 50 的灰色盒子 --> <div class="small yellow" style="position:absolute; z-index:1; top: 10px;"></div> </div> </div>
一樣的,以上兩段代碼基本同樣,都是有 3 層的 DIV 盒子。最外層是一個深藍色盒子,中間一層容器盒子,最下面一層紅色及灰色盒子。不一樣之處在於中間這層容器盒子的 z-index
由 auto
變成了 0
。最底下的紅色及灰色盒子的 Z 軸層級比較的結果就大相徑庭。性能優化
由以上兩個例子咱們能夠發現,當 z-index
爲數值而且生效的時候,容器會發生一種變化,會使得容器內的子組件沒法穿過容器自己,而且子組件的層級由父組件決定。這種變化後的容器元素咱們稱之爲層疊上下文。ide
層疊上下文有幾個特性wordpress
層疊上下文能夠嵌套,內部層疊上下文及其全部子元素均受制於外部的層疊上下文。post
這個好理解,能夠參考例子 2 。當第二層的容器盒子升級爲層疊上下文時,紅色盒子及灰色盒子的 Z 軸層級受制於第二層的容器盒子。
每一個層疊上下文和兄弟元素獨立,也就是當進行層疊變化或渲染的時候,只須要考慮後代元素。性能
這一條在性能優化上能夠用的上。在更新 DOM 元素的時候考慮上層疊上下文可使得站點性能表現更加優異。
層疊上下文未指定 z-index
時,其層疊等級與 z-index : 0
相同, 要比普通元素高。指定 z-index
時按照層疊規則來。flex
這條專門指的由 CSS3 屬性建立出來的層疊上下文,其自己未指定 z-index。其層疊等級應該是 z-index: 0。
層疊上下文大致上可分爲三種建立方式優化
z-index
值爲數值的定位元素的傳統層疊上下文其餘 CSS3 屬性(詳情可動手實驗瞭解)
z-index
值不爲 auto
的 flex
項(父元素 display : flex | inline-flex
)opacity
值不是 1
transform
值不是 none
filter
值不是 none
注意:
一、z-index: auto 和 z-index: 0 在層疊等級上屬於同一級。可是 z-index: 0 就是符合這一條「z-index 爲數值」會使得元素升級爲層疊上下文。
二、IE6,7 有個不合常理的地方,就是當元素的 z-index 爲 auto 的時候,該元素也升級爲建立層疊上下文。這就是爲何在過去 IE6/IE7 的 z-index 一直是個老大難的緣由。
在說層疊規則以前兩個概念須要你們瞭解一下,這有利於咱們在平常交流中探討相關的問題。
當元素互相層疊的時候,顯示規則以下。
z-index
值的時候(沒有明確的 z-index
值的層疊上下文也就是 CSS3 建立的層疊上下文 z-index
值爲0
)直接比較 z-index
的值,值大的處在值小的元素的上方。
招人,前端,隸屬政採雲前端大團隊(ZooTeam),50 餘個小夥伴正等你加入一塊兒浪~ 若是你想改變一直被事折騰,但願開始能折騰事;若是你想改變一直被告誡須要多些想法,卻無從破局;若是你想改變你有能力去作成那個結果,卻不須要你;若是你想改變你想作成的事須要一個團隊去支撐,但沒你帶人的位置;若是你想改變既定的節奏,將會是「5年工做時間3年工做經驗」;若是你想改變原本悟性不錯,但老是有那一層窗戶紙的模糊… 若是你相信相信的力量,相信平凡人能成就非凡事,相信能遇到更好的本身。若是你但願參與到隨着業務騰飛的過程,親手參與一個有着深刻的業務理解、完善的技術體系、技術創造價值、影響力外溢的前端團隊的成長曆程,我以爲咱們該聊聊。任什麼時候間,等着你寫點什麼,發給 ZooTeam@cai-inc.com