98

How can I detect in javascript if the user is scrolling?

user1365010
  • 2,865
  • 7
  • 22
  • 42

5 Answers5

94

this works:

window.onscroll = function (e) {  
// called when the window is scrolled.  
} 

edit:

you said this is a function in a TimeInterval..
Try doing it like so:

userHasScrolled = false;
window.onscroll = function (e)
{
    userHasScrolled = true;
}

then inside your Interval insert this:

if(userHasScrolled)
{
//do your code here
userHasScrolled = false;
}
Wampie Driessen
  • 1,549
  • 11
  • 17
12

You just said javascript in your tags, so @Wampie Driessen post could helps you.

I want also to contribute, so you can use the following when using jQuery if you need it.

 //Firefox
 $('#elem').bind('DOMMouseScroll', function(e){
     if(e.detail > 0) {
         //scroll down
         console.log('Down');
     }else {
         //scroll up
         console.log('Up');
     }

     //prevent page fom scrolling
     return false;
 });

 //IE, Opera, Safari
 $('#elem').bind('mousewheel', function(e){
     if(e.wheelDelta< 0) {
         //scroll down
         console.log('Down');
     }else {
         //scroll up
         console.log('Up');
     }

     //prevent page fom scrolling
     return false;
 });

Another example:

$(function(){
    var _top = $(window).scrollTop();
    var _direction;
    $(window).scroll(function(){
        var _cur_top = $(window).scrollTop();
        if(_top < _cur_top)
        {
            _direction = 'down';
        }
        else
        {
            _direction = 'up';
        }
        _top = _cur_top;
        console.log(_direction);
    });
});​
Oscar Jara
  • 13,805
  • 10
  • 60
  • 93
  • 2
    Isn't jQuery supposed to abstract out browser differences? Why do you have methods for different browsers? Is `$('#elem').bind('scroll'` not good enough? EDIT: Never mind, I saw your 2nd example. – gen_Eric May 15 '12 at 17:07
  • 1
    nothing wrong with a little native javascript every now and then. – AGDM Sep 20 '14 at 00:16
  • Don't you mean `e.originalEvent.wheelDelta || e.originalEvent.detail` ? – JacobRossDev Jan 23 '16 at 20:30
  • 3
    **WARNING:** The wheel events in this answer are nonstandard and deprecated. Use the `wheel` event. – Alexander O'Mara Jul 30 '16 at 22:04
  • I haven't tested this but according to MDN DOMMouseScroll isn't supported in most browsers https://developer.mozilla.org/en-US/docs/Web/Events/DOMMouseScroll – Liron Yahdav May 19 '17 at 00:17
7
window.addEventListener("scroll",function(){
    window.lastScrollTime = new Date().getTime()
});
function is_scrolling() {
    return window.lastScrollTime && new Date().getTime() < window.lastScrollTime + 500
}

Change the 500 to the number of milliseconds after the last scroll event at which you consider the user to be "no longer scrolling".

(addEventListener is better than onScroll because the former can coexist nicely with any other code that uses onScroll.)

Silas S. Brown
  • 1,304
  • 1
  • 15
  • 17
4

If you want detect when user scroll over certain div, you can do something like this:

window.onscroll = function() {
    var distanceScrolled = document.documentElement.scrollTop;
    console.log('Scrolled: ' + distanceScrolled);
}

For example, if your div appear after scroll until the position 112:

window.onscroll = function() {
    var distanceScrolled = document.documentElement.scrollTop;
    if (distanceScrolled > 112) {
      do something...
    }
}

But as you can see you don't need a div, just the offset distance you want something to happen.

0

Use an interval to check

You can setup an interval to keep checking if the user has scrolled then do something accordingly.

Borrowing from the great John Resig in his article.

Example:

    let didScroll = false;

    window.onscroll = () => didScroll = true;

    setInterval(() => {
        if ( didScroll ) {
            didScroll = false;
            console.log('Someone scrolled me!')
        }
    }, 250);

See live example

hitautodestruct
  • 19,014
  • 13
  • 62
  • 92