1. 程式人生 > >Position 與 z-Index 的關係

Position 與 z-Index 的關係

由於平時不太用到,所以過去寫css的時候對於position屬性的absoluterelative值理解比較模糊,

對於z-index的層疊更是摸不著頭腦,除了理解的因素外,各個瀏覽器的不同解析結果也是一個大問題.今天仔

細閱讀了一下css文件,總算是對盒模型的浮動、定位有了比較深刻的理解.
我們在實踐中很有可能遇到這樣的問題:
1、做一個橫向導航,然後滑鼠經過之後出現下拉選單,那麼這個下拉選單的位置控制就是一個關鍵;
2、我們想在一個正常的頁面佈局中放入幾個浮在頁面上的氣泡提示,這時既不想讓氣泡提示破壞正常的

文件佈局,又不想氣泡提示的定位在不同的瀏覽器中到處亂飄.
3、當我們在一句正常的文字中插入一個小圖示的話,一般會使用Position 與 Z-index 關係標籤,而這時它的

垂直居中問題又是讓人困惑,無論你使用html屬性absmiddle、或是使用css屬性vertical-align、

抑或是使用父物件的heigh + line-height,在不同的瀏覽器中總會看起來不同.
嗯,上面幾個問題你是否也遇到過呢?如果你至今還沒有一個很好的解決辦法,不妨繼續閱讀此文,

或許能對你有所幫助:)
我們先看一下position屬性的幾個取值定義:
position: static、absolute、relative
static :  預設值.如果沒有指定position屬性,支援position屬性的html物件都是預設為

static,可以這麼理解:把html頁面看作一個文件流,原始碼中各個標籤的先後位置就是它們所對應的對

象的呈現次序,所有取值為static的物件都按照你所編寫的html標籤的順序依次呈現.
relative:  相對定位.這個屬性值保持物件所在文件流中的位置,也就是說它具有和static相

同的呈現方式,它同樣佔有在文件流中的固定位置,後面的物件不會侵佔或覆蓋;與static屬性值不同的

是,設定了relative的物件,可以通過top,   left,right,  bottom屬性設定自己的新顯示位置,

這4個屬性的取值是相對於文件流的前一個物件的,你可以自由設定這4個屬性偏移到新的位置而不對文件

流中的其他物件產生任何影響,原來的頁面呈現仍然會我行我素:

absolute:  絕對定位.和relative不同的是,這個屬性值會將當前物件拖出文件流,後面的對

象會佔有原來的位置,也就是說,當前物件的呈現是獨立顯示的,但是它的位置在指定top,  left,

right,  bottom任一屬性之前仍是有繼承性的,這時的4個屬性的取值是相對於瀏覽器的,和文件

流無關了.如果把示例中的B區域設定為absolute而不指定  4個位置屬性,通過設定margin來改變

它的相對位置,用這個方法可以解決前面提到的問題2.

提示a:
    css2.0手冊中提到relative和absolute定位的滾動條區別不是絕對的,至少在firefox、

opera和safari中滾動條該出現還是會出現.
提示b:
    屬性值為absolute物件的z-index屬性可以設定層疊顯示的次序,它是直接有效的;
而屬性值為relative物件的z-index屬性在設定時要小心,把當前物件的z-index設定為-1是不行的,

在firefox中它會無法顯示,必須設定為0以上,我們如果想讓別的物件擋住它,只有將其他物件也設定position

為relative,並將z-index屬性取一個比它大的值即可.
上面的表述不知道也許不是很清晰,具體的理解還是要自己親自動手操作一下.
這樣看來,前面的問題就有解了,問題3我們可以根據設計的要求將其設定為相對或絕對定位;
問題1的解決方法也有很多,個人推薦使用有語義的dl, dt, dd來實現,而且這個方法在不同

瀏覽器中的表現基本相同(已在ie, firefox,  opera, safari中測試),僅在top的屬性上有

幾畫素的差異,由於時間關係我只能給出自己測試時的程式碼以供參考:
============================================================================== E看relative和absolute,z-index很重要 前幾天遇到了一個問題,就是在IE上看給div指定深度9999就是覆蓋在深度才1的div之下,當然mozilla是沒有事情的。

例子:

<divstyle="position:relative;width:100px;height:20px;">
   <divstyle="position:absolute;z-index:9999;width:20px;height:100px;background:#09f;"></div>
</div>
<divstyle="position:relative;width:100px;height:20px;">
   <divstyle="position:absolute;z-index:1;width:100px;height:20px;background:#000;"></div>
</div>



在上圖上可以知道區別了吧

為什麼IE下z-index為1的在9999的上面呢?

就是因為IE不自動識別relative的深度的問題,就是預設值就是他們的出現順序。


解決此問題

給relative也加上深度z-index就可一了,

得到的結論

最好relative和absolute都加上z-index,這樣會避免IE的問題。