css定位z-index問題

1. 某些瀏覽器下元素層級遮蓋存在bug;

2. 某個元素z-index設的太大,導致始終無法被遮蓋;

3. js動態計算z-index,導致元素覆蓋關係部可控



層級遮蓋bug出現的原因:

IE6/7對z-index的表現跟IE8及以上瀏覽器不一致。position值爲非static時,如果不設置z-index屬性,IE6/7下z-index默認爲0,而IE8及以上瀏覽器z-index爲auto,且zindex:auto的元素不參與堆疊優先級比較。


ff/chrome z-index IE6/7 IE8/9
不設置  0  auto  auto 
number  number  number  number 


層級關係的比較:

先看幾點結論:

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

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

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

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

在上面2點結論的基礎上,我們引入“定位樹”(非w3c官方詞彙)的概念來做層級的比較。

在定位樹這個概念下,瀏覽器在渲染dom節點時,除了生成dom樹之外,還會根據dom樹中的定位元素(position不爲static)生成“定位樹”:
dom樹、定位樹對比如下(其中邊上有紅色圓圈的表示該元素position不爲static):
 


可以這樣理解:定位樹中包含了dom樹中position不爲staitc的全部元素。非同級元素比較層級關係可以這樣比較:

1. 向上遍歷定位樹的父節點直到2個元素爲同級元素。

2. 根據上面的結論來最最後的比較。層級高的元素會越靠近用戶的顯示器並能覆蓋層級低的元素。


實例一:假設上圖中所有標紅色元素position都不爲static;且z-index=1,根據上面的比較規則可以知道:

1. c > (b && b *) > (a && a *) 即元素c及c的所有定位元素層級比a、b高

2. m > h、 g > k、d > m

實例二:假設a的position不爲static,z-index屬性不存在,定位樹中a的子元素z-index一次分別爲1,2,3,4...其它定位元素z-index:1:

1. 根據結論三有:IE6/7下 b > (a && a *) 即元素b的層級比a及a的所有定位元素層級高,其它瀏覽器下:i > h > b > d
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章