關於絕對定位元素的參照點,相信大家都知道,那就是離它最近的具有動態定位(absolute、relative、fixed)的祖先元素的左上角,如果它的祖先元素都沒有動態定位,則把文檔根元素即html元素的左上角當做參照點來進行絕對定位(記住,不是body元素,而是html元素,大家可以自己去驗證,這不是本文的重點)。
但是這是我們使用left或top屬性來進行定位時所遵照的原則,如果我們使用的是bottom或right屬性來進行定位,那參照點又是什么呢?不知道大家想過這個問題沒有。
這里先說明一下,left和top屬性的權重是高於right和bottom,只有在沒定義left或top的情況下,相應的right和bottom屬性才會起作用,如果left或top定義了,則會忽略right或bottom的值(但是如果元素的寬度或高度沒有定義,則在IE6除外的瀏覽器中它們也可以同時起作用,有興趣的同學可以看我這邊文章)。
好了,回到參照點上的問題來。本文僅以bottom屬性為例進行討論,right屬性是與之類似的。
是的,那么bottom的參照點是哪里呢,是瀏覽器可視區域(viewport)的底部邊緣嗎?還是用事實來說話吧。
這段代碼的效果如下:
我們可以看到bottom屬性的參照點的確是瀏覽器可視區域的下邊緣。
如果真的是這么簡單,這個問題也就不必討論了。上面的例子是沒有滾動條的情況,如果出現滾動條會怎么樣呢?
看看效果:
我們可以看到似乎沒有變化,即使瀏覽器出現了滾動條,但bottom的參照點仍然瀏覽器可視區域的下邊緣。
接着我們把滾動條拉下來一點點:
可以看到方塊也隨之往上走了,此時bottom的值仍然是0,但是方塊卻沒有靠在瀏覽器可視區域的下邊緣了。
因此,我們可以得出一個結論:絕對定位時bottom屬性的參照點是瀏覽器的第一屏(就是沒有移動滾動條的時候)的可視區域的下邊緣。
至於為什么是這樣,鬼才知道呢,但記住這個結論就行了。
有的時候我們可能需要把一個元素固定在屏幕的某個位置,IE6除外的其它瀏覽器用position:fixed就行了,但IE6就必須用腳本(或是css expression)了。根據滾動條的變化來動態改變絕對定位元素的top或left的值,這還是比較簡單的。也建議大家能使用top或left就盡量使用top和left去做這個工作。
但如果硬是要用bottom或right呢,其它瀏覽器是可以的,但IE6卻會讓你死得很難看。
回到bottom的參照點上來,上面說了,瀏覽器有滾動條時,它的參照點是滾動條沒有滾動時(也就是scrollTop為零)瀏覽器可視區域的下邊緣,如果這時滾動條滾動了,這個參照點也會隨着滾動條的滾動而滾動。就相當於這個參照點釘死在了滾動條沒有移動時的那個位置,滾動條動,頁面就動,它也隨之就動了。這很好理解吧。所有瀏覽器都是這樣的,包括IE6。但IE6往往是不按常理出牌的一個人,上面之所以說IE6在這里會有問題,是因為在IE6里,bottom的參照點是會隨之滾動條的移動而移動,但卻是亂動,沒有規矩的移動。也就是說它不是滾動條往下移動了多少距離,它就往上移動相同的距離,它移動的距離跟滾動條移動的距離是有差距的,而且這個差距的大小,貌似是沒有規律可循的。所以你用腳本去計算scrollTop的值,然后讓bottom去減去這個值,就能抵消元素位置的變化,這樣的方法在IE6中是行不通的。
看下這段把元素固定在可視區域某個位置的代碼:
在IE6以外的瀏覽器中,它是這樣的:
我們看到不管滾動條怎么移動,那個方塊始終是在那里的。
然后看看神奇的IE6又是怎么樣的:
恩,是的,滾動條往下拉一點,方塊位置也變了,滾動條再往下拉一點,然后,然后就沒有然后了。。。方塊已經跑到很下面很下面去了,我們已經看不見了。之所以這樣,就是因為上面說的bottom參照點距離的變化與scrollTop的變化是不一致的。而在其他瀏覽器中,這個距離是一致的。
我想說的就是這個問題。
另外,我還注意到了一個事情:一個絕對定位的元素(假設在它與body之間沒有動態定位的其它元素),如果顯示的把body設為動態定位,例如相對定位,那么bottom的參照點就是整個body區域的下邊緣,而不是瀏覽器可視區域的下邊緣了,即使有滾動條,也同樣是這樣。而且所有瀏覽器都是這樣的。
效果如下:
我們看到方塊是出現在了包括滾動條區域的最底部的。
但是如果我們不是給body元素設定相對定位,而是給html元素設定相對的定位的話,就又有兼容性的問題了。
這回出現錯誤的不只是IE6,還有它那同樣抽風的兄弟IE7。IE8及其以上表現是正常的。
看看IE6以及IE7的表現:
我們看到方塊並沒有出現在整個瀏覽器區域的底部,而只是出現在瀏覽器可視區域的底部。
說什么好呢,IE8以下都必須死!
總結:
今天要說的就是一句話:用bottom來進行絕對定位時,要知道它的參照點是瀏覽器的第一屏(就是沒有移動滾動條的時候)的可視區域的下邊緣,滾動條滾動時,這個參照點也會跟着動,但在IE6中則會有問題。所以在有滾動條的情況下,使用絕對定位還是盡量用top與left的好,免得出現瀏覽器兼容問題。