獲取scrollTop相容各瀏覽器的方法以及瀏覽器對scroll相關的相容性
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 賦值短語 :
通過這句賦值就能在任何情況下獲得scrollTop 值。
仔細觀察這句賦值,你發現啥了沒??
沒錯, 就是window.pageYOffset (Safari) 被放置在 || 的中間位置。
因為當數字0與undefine進行 或運算時,系統預設返回最後一個值。即或運算中 0 == undefine ;
當頁面滾動條剛好在最頂端,即scrollTop值為 0 時。 IE 下 window.pageYOffset (Safari) 返回為 undefine ,此時將window.pageYOffset (Safari) 放在或運算最後面時, scrollTop 返回 undefine , 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,可以使用如下程式碼:
varscrollTop=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')
,這會有一個副作用是如果動畫帶回調函式的畫,會執行兩次,這可能會給有些單元測試程式碼帶來一些麻煩
轉載於:https://blog.51cto.com/bangejuhao/1671138