Search code examples
jqueryscrollmousewheeltrackpad

jQuery Mousewheel doesn't support trackpad?


I'm using the popular mousewheel plugin to to emulate the fullpage scroll like this website.

jQuery(function() {
    var top = 0,
        viewport = jQuery(window).height(),
        step = jQuery(".home .l-section:first").outerHeight(),
        body = jQuery.browser.webkit ? jQuery('body') : jQuery('html'),
        wheel = false;
    jQuery('body').mousewheel(function(event, delta) {
        wheel = true;
        if (delta < 0) {
            top = (top + viewport) >= jQuery(document).height() ? top : top += step;
            body.stop().animate({
                scrollTop: top
            }, 400, function() {
                wheel = false;
            });
        } else {
            top = top <= 0 ? 0 : top -= step;
            body.stop().animate({
                scrollTop: top
            }, 400, function() {
                wheel = false;
            });
        }
        return false;
    });
    jQuery(window).on('resize', function(e) {
        viewport = jQuery(window).height();
        step = jQuery(".home .l-section:first").outerHeight();
    });
    jQuery(window).on('scroll', function(e) {
        if (!wheel) top = jQuery(this).scrollTop();
    });
});

It works great but NOT when using the trackpad. Using trackpad, it just scrolls to the bottom of the page no matter how slowly I try to scroll.


Solution

  • Works well with my laptop's trackpad. However, this is known issue, did you try using debounce?

    function mouseHandle(event) {
        newDate = new Date();
        var scrollAllowed = true;
    
        if( wheel < 10 && (newDate.getTime()-oldDate.getTime()) < 100 ) {
            scrollPos -= event.deltaY*(10-wheel);
            wheel++;
        }
        else {
            if( (newDate.getTime()-oldDate.getTime()) > 100 ) {
                wheel = 0;
                scrollPos -= event.deltaY*60;
            }
            else {
                scrollAllowed = false;
            }
        }
    
        oldDate = new Date();
    
        if( scrollAllowed ) {
            // do your stuff here
        }
    }
    
    //Apply this effect with jQuery On event
    $('body').on('mousewheel', function(event) { mouseHandle(event); });
    

    This is already reported issue here : https://github.com/brandonaaron/jquery-mousewheel/issues/36

    You will get multiple solutions there. Hope that helps. Help yourself :-)

    Peace,

    Rahul