欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

CSS z-index 層級關(guān)系優(yōu)先級的概念

  發(fā)布時間:2016-06-06 10:44:43   作者:佚名   我要評論
這篇文章主要介紹CSS z-index 層級關(guān)系優(yōu)先級的概念,講解的比較詳細,需要的朋友可以參考下。

CSS 中的 z-index 屬性用于設置節(jié)點的堆疊順序, 擁有更高堆疊順序的節(jié)點將顯示在堆疊順序較低的節(jié)點前面, 這是我們對 z-index 屬性普遍的認識. 與此同時, 我們總是對堆疊順序捉摸不透, 將 z-index 的值設得很大也未必能將節(jié)點顯示在最前面. 本文將通過一些例子對 z-index 的使用方法進行分析, 并且為各位帶入 z-index 層級樹的概念.

目錄

順序規(guī)則

如果不對節(jié)點設定 position 屬性, 位于文檔流后面的節(jié)點會遮蓋前面的節(jié)點.


復制代碼
代碼如下:
<div id="a">A</div>
<div id="b">B</div>

http://img.jbzj.com/file_images/article/201606/201606061101041.gif

CSS z-index 屬性順序規(guī)則的例子

定位規(guī)則

如果將 position 設為 static, 位于文檔流后面的節(jié)點依然會遮蓋前面的節(jié)點浮動, 所以 position:static 不會影響節(jié)點的遮蓋關(guān)系.


復制代碼
代碼如下:
<div id="a" style="position:static;">A</div>
<div id="b">B</div>

http://img.jbzj.com/file_images/article/201606/201606061101041.gif

CSS z-index 屬性定位規(guī)則的例子, static

如果將 position 設為 relative (相對定位), absolute (絕對定位) 或者 fixed (固定定位), 這樣的節(jié)點會覆蓋沒有設置 position 屬性或者屬性值為 static 的節(jié)點, 說明前者比后者的默認層級高.


復制代碼
代碼如下:
<div id="a" style="position:relative;">A</div>
<div id="b">B</div>

http://img.jbzj.com/file_images/article/201606/201606061101042.gif

CSS z-index 屬性定位規(guī)則的例子, relative | absolute | fixed

在沒有 z-index 屬性干擾的情況下, 根據(jù)這順序規(guī)則和定位規(guī)則, 我們可以做出更加復雜的結(jié)構(gòu). 這里我們對 A 和 B 都不設定 position, 但對 A 的子節(jié)點 A-1 設定 position:relative. 根據(jù)順序規(guī)則, B 會覆蓋 A, 又根據(jù)定位規(guī)則 A' 會覆蓋 B.


復制代碼
代碼如下:
<div id="a">
<div id="a-1" style="position:relative;">A-1</div>
</div>
<div id="b">B</div>

http://img.jbzj.com/file_images/article/201606/201606061101043.gif

CSS z-index 屬性互相覆蓋的例子

上面互相覆蓋在什么時候用到這樣的實現(xiàn)? 看起來偏門, 其實很常用, 比如說, 電子商務網(wǎng)站側(cè)欄的類目展示列表就可以用這個技巧來實現(xiàn).

下圖是某網(wǎng)站的類目展示區(qū)域, 二級類目的懸浮層覆蓋一級類目列表外框, 而一級類目的節(jié)點覆蓋二級類目的懸浮層. 如果使用 CSS 實現(xiàn)展示效果, 一級類目的外框相當于上面例子中的 A, 一級類目的節(jié)點相當于 A-1, 二級類目的懸浮層相當于 B.

電子商務網(wǎng)站側(cè)欄的類目展示列表

http://img.jbzj.com/file_images/article/201606/201606061101054.jpg

參與規(guī)則

我們嘗試不用 position 屬性, 但為節(jié)點加上 z-index 屬性. 發(fā)現(xiàn) z-index 對節(jié)點沒起作用.


復制代碼
代碼如下:
<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>

http://img.jbzj.com/file_images/article/201606/201606061101055.gif

CSS z-index 屬性參與規(guī)則的例子, 沒有明確定位的時候

W3C 對 z-index 屬性的描述中提到 在 z-index 屬性僅在節(jié)點的 position 屬性為 relative, absolute 或者 fixed 時生效.

    The z-index property specifies the stack order of an element. Only works on positioned elements(position: absolute;, position: relative; or position: fixed;).


復制代碼
代碼如下:
<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>

http://img.jbzj.com/file_images/article/201606/201606061101066.gif

CSS z-index 屬性參與規(guī)則的例子, 明確定位的節(jié)點才能使用 z-index 屬性

默認值規(guī)則

如果所有節(jié)點都定義了 position:relative. z-index 為 0 的節(jié)點與沒有定義 z-index 在同一層級內(nèi)沒有高低之分; 但 z-index 大于等于 1 的節(jié)點會遮蓋沒有定義 z-index 的節(jié)點; z-index 的值為負數(shù)的節(jié)點將被沒有定義 z-index 的節(jié)點覆蓋.


復制代碼
代碼如下:
<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>

http://img.jbzj.com/file_images/article/201606/201606061101077.gif

CSS z-index 屬性默認值規(guī)則的例子

通過檢查我們還發(fā)現(xiàn), 當 position 設為 relative, absolute 或者 fixed, 而沒有設置 z-index 時, IE8 以上和 W3C 瀏覽器 (下文我們統(tǒng)稱為 W3C 瀏覽器) 的 z-index 默認值是 auto, 但 IE6 和 IE7 是 0.

從父規(guī)則

如果 A, B 節(jié)點都定義了 position:relative, A 節(jié)點的 z-index 比 B 節(jié)點大, 那么 A 的子節(jié)點必定覆蓋在 B 的子節(jié)點前面.


復制代碼
代碼如下:
<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>

http://img.jbzj.com/file_images/article/201606/201606061101078.gif

CSS z-index 屬性從父規(guī)則的例子, 子節(jié)點不設定層級

如果所有節(jié)點都定義了 position:relative, A 節(jié)點的 z-index 和 B 節(jié)點一樣大, 但因為順序規(guī)則, B 節(jié)點覆蓋在 A 節(jié)點前面. 就算 A 的子節(jié)點 z-index 值比 B 的子節(jié)點大, B 的子節(jié)點還是會覆蓋在 A 的子節(jié)點前面.


復制代碼
代碼如下:
<div id="a" style="position:relative;z-index:0;">
<div id="a-1" style="position:relative;z-index:2;">A-1</div>
</div>

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

http://img.jbzj.com/file_images/article/201606/201606061101079.gif

CSS z-index 屬性從父規(guī)則的例子, 不可逾越的層級

很多人將 z-index 設得很大, 9999 什么的都出來了, 如果不考慮父節(jié)點的影響, 設得再大也沒用, 那是無法逾越的層級.

層級樹規(guī)則

可能你會覺得在 DOM 結(jié)構(gòu)中的兄弟節(jié)點會拎出來進行比較并確定層級, 其實不然.


復制代碼
代碼如下:
<div id="a" style="position:relative;z-index:2;">
<div id="a-1" style="position:relative;z-index:0;">A-1</div>
</div>

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

http://img.jbzj.com/file_images/article/201606/201606061101078.gif

CSS z-index 屬性層級樹規(guī)則的例子

我們認為同時將 position 設為 relative, absolute 或者 fixed, 并且 z-index 經(jīng)過整數(shù)賦值的節(jié)點, 會被放置到一個與 DOM 不一樣的層級樹里面, 并且在層級樹中通過對比 z-index 決定顯示的層級. 上面的例子如果用層級樹來表示的話, 應該如下圖所示.

http://img.jbzj.com/file_images/article/201606/2016060611010810.gif

CSS z-index 的層級樹

圖中雖然 A-1 (z-index:0) 的值比 B-1 (z-index:1) 小, 但因為在層級樹里 A (z-index:2) 和 B-1 在一個層級, 而 A 的值比 B-1 大, 根據(jù)從父規(guī)則, A-1 顯示在 B-1 前面.

參與規(guī)則 2

前面提到的參與規(guī)則認為只要節(jié)點的 position 屬性為 relative, absolute 或者 fixed, 即可參與層級比較, 其實不準確. 如果所有節(jié)點都定義了 position:relative, 并且將 z-index 設為整數(shù)值, 根據(jù)從父規(guī)則, 父節(jié)點的層級決定了子節(jié)點所在層級.


復制代碼
代碼如下:
<div id="a" style="position:relative;z-index:0;">
<div id="a-1" style="position:relative;z-index:100;">A-1</div>
</div>

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

<div id="c" style="position:relative;z-index:0;">
<div id="c-1">
<div id="c-1-1">
<div id="c-1-1-1" style="position:relative;z-index:1;">C-1-1-1</div>
</div>
</div>
</div>

例子中 A, B-1, C-1-1 作為父節(jié)點, z-index 的值相同, 根據(jù)順序規(guī)則, C-1-1 在 B-1 之前, B-1 在 A 之前; 又根據(jù)從父規(guī)則, 無論子節(jié)點的 z-index 值是什么, C-1-1-1 在 B-1-1 之前, B-1-1 在 A-1 之前.

http://img.jbzj.com/file_images/article/201606/2016060611010811.gif

CSS z-index 屬性參與規(guī)則 2 的例子, 所有節(jié)點參與層級比較

如果我們將所有父節(jié)點的 z-index 屬性去除, 詭異的事情發(fā)生了. IE6 和 IE7 瀏覽器顯示效果不變, 而 W3C 瀏覽器的子節(jié)點不再從父, 而是根據(jù)自身的 z-index 確定層級.


復制代碼
代碼如下:
<div id="a" style="position:relative;">
<div id="a-1" style="position:relative;z-index:100;">A-1</div>
</div>

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

<div id="c" style="position:relative;">
<div id="c-1">
<div id="c-1-1">
<div id="c-1-1-1" style="position:relative;z-index:1;">C-1-1-1</div>
</div>
</div>
</div>

根據(jù)默認值規(guī)則, IE6 / IE7 和 W3C 瀏覽器上的元素存在 z-index 默認值的區(qū)別. 我們相信, 僅當 position 設為 relative, absolute 或者 fixed, 并且 z-index 賦整數(shù)值時, 節(jié)點被放置到層級樹; 而 z-index 為默認值時, 只在 document 兄弟節(jié)點間比較層級. 在 W3C 瀏覽器中, A, B-1 和 C-1-1 的 z-index 均為 auto, 不參與層級比較.

http://img.jbzj.com/file_images/article/201606/2016060611010812.gif

CSS z-index 屬性參與規(guī)則 2 的例子, z-index 為 auto 的節(jié)點不參與層級比較

而在 IE6 和 IE7 中, 因為 z-index 的默認值是 0, 所以也參與了層級比較.

http://img.jbzj.com/file_images/article/201606/2016060611010913.gif

CSS z-index 屬性參與規(guī)則 2 的例子, IE6 和 IE7 中 z-index 默認為 0

設置了 position 而沒有 z-index 的節(jié)點雖然不參與層級樹的比較, 但還會在 DOM 中與兄弟節(jié)點進行層級比較.


復制代碼
代碼如下:
<div id="a" style="position:relative;">
<div id="a-1" style="position:relative;z-index:100;">A-1</div>
</div>

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

<div id="c" style="position:relative;">
<div id="c-1">
<div id="c-1-1">
<div id="c-1-1-1" style="position:relative;z-index:1;">C-1-1-1</div>
</div>
</div>
</div>

我們對上個例子改造一下, 將 B-1 的 position 屬性刪除后, W3C 瀏覽器顯示如下圖. 根據(jù)定位規(guī)則, A 和 C-1-1 會顯示在 B-1 的前面; 而根據(jù)順序規(guī)則, C-1-1 又顯示在 A 前面.

http://img.jbzj.com/file_images/article/201606/2016060611010914.gif

CSS z-index 屬性參與規(guī)則 2 的例子, position 為 auto 的節(jié)點不參與層級樹比較, 但仍參與 DOM 兄弟節(jié)點間的層級比較, W3C 瀏覽器

在 IE6 和 IE7 中, 因為 A 和 C-1-1 設置了 position:relative, 而且 z-index 的默認值為 0, 所以也參與層級樹比較, 所以有如下效果.

http://img.jbzj.com/file_images/article/201606/2016060611010915.gif

CSS z-index 屬性參與規(guī)則 2 的例子, position 為 auto 的節(jié)點不參與層級樹比較, 但仍參與 DOM 兄弟節(jié)點間的層級比較, IE6 和 IE7

總結(jié)

瀏覽器節(jié)點顯示層級是一個費力的活, 今天你覺得 A 區(qū)塊會永遠置頂, 但明天因為需求變動, 突然出現(xiàn) B 元素需要置頂. 一層一層往上堆砌, 某天回頭一看, 發(fā)現(xiàn)很多區(qū)塊交錯在一起, 而且他們的值一個比一個大, 根本搞不清頭緒. 我覺得在操刀干活之前, 最好先將 position, z-index 和層級的關(guān)系搞搞清楚, 以免后患無窮.

另外, 非情非得已, 切勿用 JavaScript 計算 z-index, 并將某個節(jié)點的 z-index 設置成所有節(jié)點中層級最高.

因為篇幅太長, 本文僅從節(jié)點屬性角度進行討論, 沒有涉及 select 和 iframe 等特殊頁面節(jié)點考慮, 如果有機會下次再為大家分享.

以上就是CSS z-index 層級關(guān)系優(yōu)先級的概念全部內(nèi)容,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論