1、各瀏覽器下 scrollTop的差異
IE6/7/8:
對於沒有doctype聲明的頁面裏可以使用 document.body.scrollTop 來獲取 scrollTop高度 ;
對於有doctype聲明的頁面則可以使用 document.documentElement.scrollTop;
Safari:
safari 比較特別,有自己獲取scrollTop的函數 : window.pageYOffset ;
Firefox:
火狐等等相對標準些的瀏覽器就省心多了,直接用 document.documentElement.scrollTop ;
2、獲取scrollTop值
完美的獲取scrollTop 賦值短語 :
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
通過這句賦值就能在任何情況下獲得scrollTop 值。
仔細觀察這句賦值,你發現啥了沒??
沒錯, 就是 window.pageYOffset (Safari) 被放置在 || 的中間位置。
因爲當 數字0 與 undefine 進行 或運算時,系統默認返回最後一個值。即或運算中 0 == undefine ;
當頁面滾動條剛好在最頂端,即scrollTop值爲 0 時。 IE 下 window.pageYOffset (Safari) 返回爲 undefine ,此時將window.pageYOffset (Safari) 放在或運算最後面時, scrollTop 返回 undefine , undefine 用在接下去的運算就會報錯咯。
而其他瀏覽器 無論 scrollTop 賦值或運算順序如何都不會返回 undefine. 可以安全使用..
所以說到頭還是IE的問題咯. 杯具…
精神有點恍惚,不知道有沒有表達清楚。
不過最後總結出來這句實驗過OK,大家放心使用;
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
DTD相關說明:
頁面具有 DTD,或者說指定了 DOCTYPE 時,使用 document.documentElement。
頁面不具有 DTD,或者說沒有指定了 DOCTYPE,時,使用 document.body。
在 IE 和 Firefox 中均是如此。
爲了兼容,不管有沒有 DTD,可以使用如下代碼:
var scrollTop = window.pageYOffset //用於FF || document.documentElement.scrollTop || document.body.scrollTop || 0;
3. scroll事件
我在綁定全局的scroll
事件的時候有一點是比較糾結的,是綁定到window
還是document, document.body, document.documentElement
,參考這篇文章可以對不同瀏覽器對scroll
事件的兼容性有大致的瞭解
總結下來就是對於普通的元素都是有scroll
事件的,但是如果想給瀏覽器的整個窗口綁scroll
事件的話,要綁在window
上以避免兼容性的問題
4. scroll相關的屬性
原生得DOM api如果想要取得scrollLeft
和scrollTop
的值在普通的DOM上是沒問題的,但是在瀏覽器的層面上又出現了問題了,參考這篇文章,但是這篇文章的年代有些久遠,有些地方已經出現偏差
實際的檢測中在chrome32 下標準模式(後面再寫博客介紹)下已經開始推薦使用document.documentElment
,因爲在標準模式下的console裏會有warning
body.scrollTop is deprecated in strict mode. Please use 'documentElement.scrollTop' if in strict mode and 'body.scrollTop' only if in quirks mode.
也就是說新版本的chrome在標準模式下通過body, html
都能取到值了,但是在怪異模式下還是隻能通過body
來取得的
但是如果是通過jQuery
的apijQuery.scrollTop()
來獲取的話$(window)
都是能獲取到的,$('body'), $('html')
能不能獲取到就要參照上圖了,在設置的時候也是$(window)
設置都能夠起效,但是另兩個就要參照上圖了,現在看起來jquery獲取瀏覽器滾動條的位置也應該用window
了,但是我們忽略了一個地方就是animate
jQuery
的animate
支持對scrollTop, scrollLeft
屬性做動畫
In addition to style properties, some non-style properties such as scrollTop and scrollLeft, as well as custom properties, can be animated.
但是如果我們將這個動畫加在window
上的話不管哪個瀏覽器都不能起效了, 保險的做法是把動畫加在$('body, html')
,這會有一個副作用是如果動畫帶回調函數的畫,會執行兩次,這可能會給有些單元測試代碼帶來一些麻煩