可以使用Window.Onscroll方法来检测滚动方向吗?

14

能否使用Window.Onscroll方法来检测滚动方向?

3个回答

22
如果您在页面加载时记录scrollX和scrollY,并在每次滚动事件发生时记录新值,那么您可以比较先前的值和新值来确定滚动的方向。以下是一个概念验证:
如果您记录页面加载时的scrollX和scrollY以及每次发生滚动事件时的新值,则可以比较先前的值和新值以确定滚动的方向。这是一个概念证明:
function scrollFunc(e) {
    if ( typeof scrollFunc.x == 'undefined' ) {
        scrollFunc.x=window.pageXOffset;
        scrollFunc.y=window.pageYOffset;
    }
    var diffX=scrollFunc.x-window.pageXOffset;
    var diffY=scrollFunc.y-window.pageYOffset;

    if( diffX<0 ) {
        // Scroll right
    } else if( diffX>0 ) {
        // Scroll left
    } else if( diffY<0 ) {
        // Scroll down
    } else if( diffY>0 ) {
        // Scroll up
    } else {
        // First scroll event
    }
    scrollFunc.x=window.pageXOffset;
    scrollFunc.y=window.pageYOffset;
}
window.onscroll=scrollFunc

+1:这正是我要说的。我唯一要补充的是,可能有某种输入设备可以让您自由滚动(不仅限于X或Y),因此我会将一个大IF分成两个。如果是第一次滚动,您还可以假设它向下或向右滚动。此外,您可能需要检查内部页面链接的情况(例如:href =“#top”)。 - nickf
运行得非常好!不知道如何计算滚动速度? - David Okuniev
5
我认为你可以获取事件的时间戳。找到两个连续事件之间的差异,并将上述计算出的差异除以时间戳差异。 - Edward Dale

2
使用jQuery,您还可以注册自定义滚动事件,该事件将滚动更改作为参数提供给事件处理程序:
var previous_scroll = $(window).scrollTop();

$(window).on('scroll', function() {
    var scroll = $(window).scrollTop(),
        scroll_change = scroll - previous_scroll;
    previous_scroll = scroll;
    $(window).trigger('custom_scroll', [scroll_change]);
});

然后不要使用scroll,而是绑定到custom_scroll:
$(window).on('custom_scroll', function pos(e, scroll_change) {
    console.log(scroll_change);
});

0

我在ie8中遇到了问题(虽然它对ie9、FF和Chrome是兼容的)- 所有的滚动似乎都被检测为水平的。

这里有一个修改过的脚本demo,它也适用于ie8,并且可能覆盖了更多的浏览器。

function scrollFunc(e) {

   function getMethod() {
        var x = 0, y = 0;
        if ( typeof( window.pageYOffset ) == 'number' ) {
          x = window.pageXOffset;
          y = window.pageYOffset;
        } 

        else if( document.body && (document.body.scrollLeft || document.body.scrollTop ) ) {
          x = document.body.scrollLeft;
          y = document.body.scrollTop;
        } 

        else if( document.documentElement && (document.documentElement.scrollLeft ||     document.documentElement.scrollTop ) ) {
          x = document.documentElement.scrollLeft;
          y = document.documentElement.scrollTop;
        }

         return [x, y];
    }

    var xy = getMethod();            
    var xMethod = xy[0];           
    var yMethod = xy[1];

    if ( typeof scrollFunc.x == 'undefined' ) {
       scrollFunc.x = xMethod;
       scrollFunc.y = yMethod;
    }

    var diffX = scrollFunc.x - xMethod;
    var diffY = scrollFunc.y - yMethod;


    if( diffX<0 ) {
       // Scroll right
    } else if( diffX>0 ) {
       // Scroll left
    } else if( diffY<0 ) {
       // Scroll down
    } else if( diffY>0 ) {
       // Scroll up
    } else {
       // First scroll event
    }
    scrollFunc.x = xMethod;
    scrollFunc.y = yMethod;
}

window.onscroll=scrollFunc​

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接