用于检测浏览器窗口的scrollTop的跨浏览器方法

什么是检测浏览器窗口的scrollTop最好的跨浏览器的方式? 我更喜欢不使用任何预build的代码库,因为这是一个非常简单的脚本,我不需要所有的重量。

function getScrollTop(){ if(typeof pageYOffset!= 'undefined'){ //most browsers except IE before #9 return pageYOffset; } else{ var B= document.body; //IE 'quirks' var D= document.documentElement; //IE with doctype D= (D.clientHeight)? D: B; return D.scrollTop; } } alert(getScrollTop()) 

或者只是简单的:

 var scrollTop = document.body.scrollTop || document.documentElement.scrollTop; 

如果你不想包含一个完整的JavaScript库,你通常可以从一个提取你想要的位。

例如,这实际上是jQuery如何实现跨浏览器滚动(Top | Left):

 function getScroll(method, element) { // The passed in `method` value should be 'Top' or 'Left' method = 'scroll' + method; return (element == window || element == document) ? ( self[(method == 'scrollTop') ? 'pageYOffset' : 'pageXOffset'] || (browserSupportsBoxModel && document.documentElement[method]) || document.body[method] ) : element[method]; } getScroll('Top', element); getScroll('Left', element); 

注意:你会注意到上面的代码包含一个未定义的browserSupportsBoxModelvariables。 jQuery通过临时添加一个div到页面中,然后测量一些属性来确定浏览器是否正确实现了box模型。 你可以想象这个标志检查IE。 具体来说,它会以怪癖模式检查IE 6或7 。 由于检测相当复杂,因此我假定您已经在代码中的其他地方使用了浏览器 function 检测 。

编辑:如果你还没有猜到,我强烈build议你使用这些库的东西。 开销是一个很小的代价,要支付强大和面向未来的代码,任何人都可以通过跨浏览器框架来提高效率。 (而不是花费无数个小时对付IE浏览器)。

 function getSize(method) { return document.documentElement[method] || document.body[method]; } getSize("scrollTop"); 

我一直在使用window.scrollY || document.documentElement.scrollTop window.scrollY || document.documentElement.scrollTop

window.scrollY覆盖除IE以外的所有浏览器。
document.documentElement.scrollTop覆盖IE。

YUI 2.8.1的代码是这样的:

 function getDocumentScrollTop(doc) { doc = doc || document; //doc.body.scrollTop is IE quirkmode only return Math.max(doc.documentElement.scrollTop, doc.body.scrollTop); } 

我认为jQuery 1.4.2代码(有点为人类翻译),并假设我正确理解这一点:

 function getDocumentScrollTop(doc) { doc = doc || document; win = doc.defaultView || doc.parentWindow; //parentWindow is for IE < 9 result = 0; if("pageYOffset" in win) //I'don't know why they use this, probably they tested it to be faster than doing: if(typeof win.pageYOffset !== 'undefined') result = win.pageYOffset; else result = (jQuery.support.boxModel && document.documentElement.scrollTop) || document.body.scrollTop; return result; } 

Unfortunatley提取jQuery.support.boxModel的价值几乎是不可能的,因为你将不得不添加一个临时的子元素到文档中,并做相同的testingjQuery。

我知道自从这个线程被更新以来它已经有一段时间了,但是这是我创build的一个函数,它允许开发人员find实际托pipe的根元素有一个可用的“scrollTop”属性。 适用于Mac OS X(10.9.5)的Chrome 42和Firefox 37testing:

 function getScrollRoot(){ var html = document.documentElement, body = document.body, cacheTop = ((typeof window.pageYOffset !== "undefined") ? window.pageYOffset : null) || body.scrollTop || html.scrollTop, // cache the window's current scroll position root; html.scrollTop = body.scrollTop = cacheTop + (cacheTop > 0) ? -1 : 1; // find root by checking which scrollTop has a value larger than the cache. root = (html.scrollTop !== cacheTop) ? html : body; root.scrollTop = cacheTop; // restore the window's scroll position to cached value return root; // return the scrolling root element } // USAGE: when page is ready: create a global variable that calls this function. var scrollRoot = getScrollRoot(); scrollRoot.scrollTop = 10; // set the scroll position to 10 pixels from the top scrollRoot.scrollTop = 0; // set the scroll position to the top of the window 

希望这个对你有帮助! 干杯。

这从IE5到IE11运作良好。 它也支持所有主要的新浏览器。

 var scrollTop = (document.documentElement && document.documentElement.scrollTop) || (document.body.scrollTop) || (document.scrollingElement); 

为了节省你所有的麻烦,使用一个框架,如jquery或mootools,它们在$('element')。getTop()中计算所有这些值在一行(跨浏览器)。 在jQuery中,你将需要一个名为维的插件,如果我没有记错的话,尽pipe大部分时间甚至没有框架,你实际上可以使用element.getScrollTop(); 得到你所需要的唯一的问题是在IE7和以下这个计算有点bug,因为它没有考虑到元素的位置值,例如,如果你有一个位置:该元素的绝对css属性计算是在该元素的父元素上执行