CSS基礎(七):z-index詳解

概念css

z-index 屬性設置元素的堆疊順序。擁有更高堆疊順序的元素老是會處於堆疊順序較低的元素的前面。html

 

層級關係的比較瀏覽器

1. 對於同級元素,默認(或position:static)狀況下文檔流後面的元素會覆蓋前面的。網站

2. 對於同級元素,position不爲static且z-index存在的狀況下z-index大的元素會覆蓋z-index小的元素,即z-index越大優先級越高。url

3. IE6/7下position不爲static,且z-index不存在時z-index爲0,除此以外的瀏覽器z-index爲auto。spa

4. z-index爲auto的元素不參與層級關係的比較,由向上遍歷至此且z-index不爲auto的元素來參與比較。3d

 

順序規則code

若是不對節點設定 position 屬性,位於文檔流後面的節點會遮蓋前面的節點。htm

<div id="a">A</div>
<div id="b">B</div>

 

定位規則blog

若是將 position 設爲 static,位於文檔流後面的節點依然會遮蓋前面的節點浮動,,因此 position:static 不會影響節點的遮蓋關係。

<div id="a" style="position:static;">A</div>
<div id="b">B</div>

若是將 position 設爲 relative (相對定位),absolute (絕對定位) 或者 fixed (固定定位),這樣的節點會覆蓋沒有設置 position 屬性或者屬性值爲 static 的節點,說明前者比後者的默認層級高。

<div id="a" style="position:relative;">A</div>
<div id="b">B</div>

在沒有 z-index 屬性干擾的狀況下, 根據這順序規則和定位規則, 咱們能夠作出更加複雜的結構. 這裏咱們對 A 和 B 都不設定 position, 但對 A 的子節點 A-1 設定 position:relative. 根據順序規則, B 會覆蓋 A, 又根據定位規則 A' 會覆蓋 B.

<div id="a">
    <div id="a-1" style="position:relative;">A-1</div>
</div>
<div id="b">B</div>

上面互相覆蓋在何時用到這樣的實現? 看起來偏門, 其實很經常使用, 好比說, 電子商務網站側欄的類目展現列表就能夠用這個技巧來實現.

下圖是某網站的類目展現區域, 二級類目的懸浮層覆蓋一級類目列表外框, 而一級類目的節點覆蓋二級類目的懸浮層. 若是使用 CSS 實現展現效果, 一級類目的外框至關於上面例子中的 A, 一級類目的節點至關於 A-1, 二級類目的懸浮層至關於 B.

 

參與規則

咱們嘗試不用 position 屬性, 但爲節點加上 z-index 屬性. 發現 z-index 對節點沒起做用. z-index 屬性僅在節點的 position 屬性爲 relative, absolute 或者 fixed 時生效.

<div id="a" style="z-index:2;">A</div>
<div id="b" style="z-index:1;">B</div>
<div id="c" style="z-index:0;">C</div>

<div id="a" style="z-index:2;">A</div>
<div id="b" style="position:relative;z-index:1;">B</div>
<div id="c" style="position:relative;z-index:0;">C</div>

 

默認值規則

若是全部節點都定義了 position:relative. z-index 爲 0 的節點與沒有定義 z-index 在同一層級內沒有高低之分; 但 z-index 大於等於 1 的節點會遮蓋沒有定義 z-index 的節點; z-index 的值爲負數的節點將被沒有定義 z-index 的節點覆蓋.

<div id="a" style="position:relative;z-index:1;">A</div>
<div id="b" style="position:relative;z-index:0;">B</div>
<div id="c" style="position:relative;">C</div>
<div id="d" style="position:relative;z-index:0;">D</div>

 

從父規則

若是 A, B 節點都定義了 position:relative, A 節點的 z-index 比 B 節點大, 那麼 A 的子節點一定覆蓋在 B 的子節點前面.

<div id="a" style="position:relative;z-index:1;">
    <div id="a-1">A-1</div>
</div>
 
<div id="b" style="position:relative;z-index:0;">
    <div id="b-1">B-1</div>
</div>

 

若是全部節點都定義了 position:relative, A 節點的 z-index 和 B 節點同樣大, 但由於順序規則, B 節點覆蓋在 A 節點前面. 就算 A 的子節點 z-index 值比 B 的子節點大, B 的子節點仍是會覆蓋在 A 的子節點前面.

 

不少人將 z-index 設得很大, 9999 什麼的都出來了, 若是不考慮父節點的影響, 設得再大也沒用, 那是沒法逾越的層級.

 

文章參考

http://www.neoease.com/css-z-index-property-and-layering-tree/

http://etosun.com/z-index.html

 

做者: ForEvErNoME
出處: http://www.cnblogs.com/ForEvErNoME/
歡迎轉載或分享,但請務必聲明文章出處。若是文章對您有幫助,但願你能 推薦關注
相關文章
相關標籤/搜索