【问题标题】:JavaScript get window X/Y position for scrollJavaScript 获取滚动的窗口 X/Y 位置
【发布时间】:2011-03-28 18:01:15
【问题描述】:

我希望找到一种方法来获取当前可视窗口的位置(相对于总页面宽度/高度),以便我可以使用它来强制从一个部分滚动到另一个部分。但是,在猜测哪个对象拥有浏览器的真实 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);,直到它达到我想要的点。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    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 解决方案。道歉。修改了。
    • 现在可以使用了。我认为他们在 webkit 中有一个非常临时的错误,他们已经修复了它。我写了一个插件,因为这个错误而完全崩溃,用户向我报告了这一点。非常可怕,这些基本的东西可能会破坏
    • 这是 $(window).scrollTop(); 的代码吗? ?在这个答案中包含 jQuery 方法可能会很有用。
    • 我发布的代码是对 jQuery.fn.offset() 的解释。 scrollTop() / scrollLeft() 基本相同,但不要减去clientTop / clientLeft。
    • 方法是什么?
    【解决方案2】:

    也许更简单;

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

    致谢:so.dom.js#L492

    【讨论】:

    • 完美跨浏览器安全!最佳解决方案。
    • 那比答案码好用,但是……答案码不起作用,一点也不……
    • 我想知道为什么不直接使用document.documentElement.scrollTop,它在任何地方都可以使用。
    • 如今,除了 MSIE(所有版本)之外,以上所有内容都是所有现代浏览器上 window.scrollY 的别名。只要 MSIE11 仍在场景中,window.pageYOffset 就可能是最好的作品——在您完全放弃 MSIE 之前。
    【解决方案3】:

    使用纯 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>

    【讨论】:

    • 您链接到的页面显示“为了跨浏览器兼容性,请使用 window.pageYOffset 而不是 window.scrollY。”
    • 这不适用于 IE。 IE 需要类似window.pageYOffset
    【解决方案4】:
    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);
    
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 2021-01-12
      • 1970-01-01
      相关资源
      最近更新 更多