JavaScript获取滚动的窗口X / Y位置


213

我希望找到一种方法来获取当前可见窗口的位置(相对于总页面宽度/高度),以便可以用它强制从一个部分滚动到另一部分。但是,要猜测哪个对象对您的浏览器拥有真正的X / Y,似乎有很多选择。

为了确保IE 6 +,FF 2+和Chrome / Safari能正常工作,我需要选择以下哪两项?

window.innerWidth
window.innerHeight
window.pageXOffset
window.pageYOffset
document.documentElement.clientWidth
document.documentElement.clientHeight
document.documentElement.scrollLeft
document.documentElement.scrollTop
document.body.clientWidth
document.body.clientHeight
document.body.scrollLeft
document.body.scrollTop

还有其他吗?一旦知道窗口在哪里,就可以设置一个事件链,该事件链将缓慢调用window.scrollBy(x,y);直到到达所需位置。

Answers:


282

jQuery(v1.10)用来查找的方法是:

var doc = document.documentElement;
var left = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);
var top = (window.pageYOffset || doc.scrollTop)  - (doc.clientTop || 0);

那是:

  • window.pageXOffset首先进行测试,并使用它(如果存在)。
  • 否则,使用document.documentElement.scrollLeft
  • 然后减去document.documentElement.clientLeft它是否存在。

对于在根元素上应用边框(不是填充或边距,而是实际边框)的情况,仅在某些浏览器中才可能需要用document.documentElement.clientLeft/ 减去Top


托马斯(Thomas)-您完全正确。我的错。评论已删除。我重新阅读了您的评论,并意识到您的解决方案根本不是Jquery解决方案。道歉。改装了。
Bangkokian

现在可以使用了。我认为他们在Webkit中有一个非常临时的错误,他们已经解决了。我写了一个由于该错误而完全崩溃的插件,用户向我报告了这个问题。这样的基本情况可能会令人恐惧
vsync

2
这是$(window).scrollTop()的代码吗??在此答案中也包括jQuery方法可能会很有用。
Phil 2015年

1
我发布的代码是对后来发生的事情的解释jQuery.fn.offset()scrollTop()/ scrollLeft()基本上相同,但是不要减去clientTop / clientLeft。
thomasrutter

什么方法?
Maxrunner

208

也许更简单;

var top  = window.pageYOffset || document.documentElement.scrollTop,
    left = window.pageXOffset || document.documentElement.scrollLeft;

学分:so.dom.js#L492


1
完全跨浏览器安全!最佳解决方案。
西蒙·斯坦伯格2015年

1
那比应答代码更好,但是...应答代码不起作用,一点也不...
Hydroper

2
我不知道为什么不仅仅使用document.documentElement.scrollTop哪一种都可以。
vsync

33

使用纯JavaScript可以使用Window.scrollXWindow.scrollY

window.addEventListener("scroll", function(event) {
    var top = this.scrollY,
        left =this.scrollX;
}, false);

笔记

pageXOffset属性是scrollX属性的别名,而pageYOffset属性是scrollY属性的别名:

window.pageXOffset == window.scrollX; // always true
window.pageYOffset == window.scrollY; // always true

这是一个快速演示

window.addEventListener("scroll", function(event) {
  
    var top = this.scrollY,
        left = this.scrollX;
  
    var horizontalScroll = document.querySelector(".horizontalScroll"),
        verticalScroll = document.querySelector(".verticalScroll");
    
    horizontalScroll.innerHTML = "Scroll X: " + left + "px";
      verticalScroll.innerHTML = "Scroll Y: " + top + "px";
  
}, false);
*{box-sizing: border-box}
:root{height: 200vh;width: 200vw}
.wrapper{
    position: fixed;
    top:20px;
    left:0px;
    width:320px;
    background: black;
    color: green;
    height: 64px;
}
.wrapper div{
    display: inline;
    width: 50%;
    float: left;
    text-align: center;
    line-height: 64px
}
.horizontalScroll{color: orange}
<div class=wrapper>
    <div class=horizontalScroll>Scroll (x,y) to </div>
    <div class=verticalScroll>see me in action</div>
</div>


6
链接到的页面显示“为实现跨浏览器兼容性,请使用window.pageYOffset而不是window.scrollY。”
JeremyWeir

这不适用于IE。IE要求类似window.pageYOffset
hipkiss16年

-1
function FastScrollUp()
{
     window.scroll(0,0)
};

function FastScrollDown()
{
     $i = document.documentElement.scrollHeight ; 
     window.scroll(0,$i)
};
 var step = 20;
 var h,t;
 var y = 0;
function SmoothScrollUp()
{
     h = document.documentElement.scrollHeight;
     y += step;
     window.scrollBy(0, -step)
     if(y >= h )
       {clearTimeout(t); y = 0; return;}
     t = setTimeout(function(){SmoothScrollUp()},20);

};


function SmoothScrollDown()
{
     h = document.documentElement.scrollHeight;
     y += step;
     window.scrollBy(0, step)
     if(y >= h )
       {clearTimeout(t); y = 0; return;}
     t = setTimeout(function(){SmoothScrollDown()},20);

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.