在CSS2.1規範中,每一個盒模型的位置是三維的,分別是平面畫布上的x軸,y軸以及表示層疊的z軸。層疊上下文即元素在某個層級上z軸方向的排列關係。javascript
那麼這裏有幾個重要的概念:層疊上下文 (堆疊上下文, Stacking Context)、層疊等級 (層疊水平, Stacking Level)、層疊順序 (層疊次序, 堆疊順序, Stacking Order)、z-index。html
文章<關於z-index 那些你不知道的事>有一個很好的比喻,這裏引用一下;java
能夠想象一張桌子,上面有一堆物品,這張桌子就表明着一個層疊上下文。 若是在第一張桌子旁還有第二張桌子,那第二張桌子就表明着另外一個層疊上下文。web
如今想象在第一張桌子上有四個小方塊,他們都直接放在桌子上。 在這四個小方塊之上有一片玻璃,而在玻璃片上有一盤水果。 這些方塊、玻璃片、水果盤,各自都表明着層疊上下文中一個不一樣的層疊層,而這個層疊上下文就是桌子。佈局
每個網頁都有一個默認的層疊上下文。 這個層疊上下文(桌子)的根源就是 <html></html>
。 html標籤中的一切都被置於這個默認的層疊上下文的一個層疊層上(物品放在桌子上)。flex
當你給一個定位元素賦予了除 auto
外的 z-index 值時,你就建立了一個新的層疊上下文,其中有着獨立於頁面上其餘層疊上下文和層疊層的層疊層, 這就至關於你把另外一張桌子帶到了房間裏。spa
層疊上下文1 (Stacking Context 1)是由文檔根元素造成的, 層疊上下文2和3 (Stacking Context 2, 3) 都是層疊上下文1 (Stacking Context 1) 上的層疊層。 他們各自也都造成了新的層疊上下文,其中包含着新的層疊層。翻譯
在層疊上下文中,其子元素按照上面解釋的規則進行層疊。造成層疊上下文的方法有:code
<html></html>
position
值爲 absolute|relative
,且 z-index
值不爲 auto
position
值爲 fixed|sticky
z-index
值不爲 auto
的flex元素,即:父元素 display:flex|inline-flex
opacity
屬性值小於 1
的元素transform
屬性值不爲 none
的元素mix-blend-mode
屬性值不爲 normal
的元素filter
、 perspective
、 clip-path
、 mask
、 mask-image
、 mask-border
、 motion-path
值不爲none
的元素perspective
值不爲 none
的元素isolation
屬性被設置爲 isolate
的元素will-change
中指定了任意 CSS 屬性,即使你沒有直接指定這些屬性的值-webkit-overflow-scrolling
屬性被設置 touch
的元素總結:orm
層疊等級 (層疊水平, Stacking Level) 決定了同一個層疊上下文中元素在z軸上的顯示順序的概念;
注意,層疊等級並不必定由 z-index 決定,只有定位元素的層疊等級才由 z-index 決定,其餘類型元素的層疊等級由層疊順序、他們在HTML中出現的順序、他們的父級以上元素的層疊等級一同決定,詳細的規則見下面層疊順序的介紹。
在 CSS 2.1 中, 全部的盒模型元素都處於三維座標系中。 除了咱們經常使用的橫座標和縱座標, 盒模型元素還能夠沿着"z 軸"層疊擺放, 當他們相互覆蓋時, z 軸順序就變得十分重要。
z-index 只適用於定位的元素,對非定位元素無效,它能夠被設置爲正整數、負整數、0、auto,若是一個定位元素沒有設置 z-index,那麼默認爲auto;
元素的 z-index 值只在同一個層疊上下文中有意義。若是父級層疊上下文的層疊等級低於另外一個層疊上下文的,那麼它 z-index 設的再高也沒用。因此若是你遇到 z-index 值設了很大,可是不起做用的話,就去看看它的父級層疊上下文是否被其餘層疊上下文蓋住了。
這裏實際上是涉及了所謂的層疊水平(stacking level),有一張圖能夠很好的詮釋:
運用上圖的邏輯,上面的題目就迎刃而解,inline-blcok
的 stacking level
比之 float
要高,因此不管 DOM 的前後順序都堆疊在上面。
不過上面圖示的說法有一些不許確,按照 W3官方 的說法,準確的 7 層爲:
稍微翻譯一下:
z-index
的子堆疊上下文元素 (負的越高越堆疊層級越低)inline-block
,無 position
定位(static除外)的子元素position
定位(static除外)的 float 浮動元素inline-block
元素,無 position
定位(static除外)的子元素(包括 display:table 和 display:inline )z-index:0
的子堆疊上下文元素z-index:
的子堆疊上下文元素(正的越低越堆疊層級越低)因此咱們的兩個 div
的比較是基於上面所列出來的 4 和 5 。5 的 stacking level
更高,因此疊得更高。
不過!不過!不過!重點來了,請注意,上面的比較是基於兩個 div
都沒有造成 堆疊上下文
這個爲基礎的。下面咱們修改一下題目,給兩個 div
,增長一個 opacity
:
.container{ position:relative; background:#ddd; } .container > div{ width:200px; height:200px; opacity:0.9; // 注意這裏,增長一個 opacity } .float{ float:left; background-color:deeppink; } .inline-block{ display:inline-block; background-color:yellowgreen; margin-left:-100px; }
會看到,inline-block
的 div
再也不必定疊在 float
的 div
之上,而是和 HTML 代碼中 DOM 的堆放順序有關,後添加的 div 會 疊在先添加的 div 之上。
這裏的關鍵點在於,添加的 opacity:0.9
這個讓兩個 div 都生成了 stacking context(堆疊上下文)
的概念。此時,要對二者進行層疊排列,就須要 z-index ,z-index 越高的層疊層級越高。
堆疊上下文是HTML元素的三維概念,這些HTML元素在一條假想的相對於面向(電腦屏幕的)視窗或者網頁的用戶的 z 軸上延伸,HTML 元素依據其自身屬性按照優先級順序佔用層疊上下文的空間。
層疊順序 (層疊次序, 堆疊順序, Stacking Order) 描述的是元素在同一個層疊上下文中的順序規則,從層疊的底部開始,共有七種層疊順序,如圖: