How to disable scrolling temporarily?

前端 未结 30 2546
萌比男神i
萌比男神i 2020-11-21 05:16

I\'m using the scrollTo jQuery plugin and would like to know if it is somehow possible to temporarily disable scrolling on the window element through Javascript? The reason

相关标签:
30条回答
  • 2020-11-21 05:35
    var winX = null, winY = null;
    window.addEventListener('scroll', function () {
        if (winX !== null && winY !== null) {
            window.scrollTo(winX, winY);
        }
    });
    function disableWindowScroll() {
        winX = window.scrollX;
        winY = window.scrollY;
    };
    function enableWindowScroll() {
        winX = null;
        winY = null;
    };
    
    0 讨论(0)
  • 2020-11-21 05:35

    I found this answer on another site:

    Disable scroll:

    $( ".popup").live({
        popupbeforeposition: function(event, ui) {
        $("body").on("touchmove", false);
    }
    });
    

    After close popup release scroll:

    $( ".popup" ).live({
        popupafterclose: function(event, ui) {
        $("body").unbind("touchmove");
    }
    });
    
    0 讨论(0)
  • 2020-11-21 05:36

    The simplest method is:

    $("body").css("overflow", "hidden"); // Remove the scroll bar temporarily
    

    To undo it:

    $("body").css("overflow", "auto");
    

    Easy to implement, but the only downside is:

    • The page will jump a bit to the left if it is center-aligned (horizontally).

    This is due to the scroll bar being removed, and the viewport becoming a bit wider.

    0 讨论(0)
  • 2020-11-21 05:36

    I had a similar animation problem on mobile screens but not on laptops, when trying to animate a div using jquery's animate command. So I decided to use a timer that restored the window's scroll position so frequently that to a naked eye the document would appear static. This solution worked perfectly on a small screen mobile device like Samsung Galaxy-2 or iphone-5.

    Main Logic of this approach: The timer to set window's scroll position to original scroll position should be started before the jquery animate command, and then when animation is completed we need to clear this timer (original scroll position is the position just before animation starts).

    I found to my pleasant surprise that the document actually appeared static during the animation duration if the timer interval was 1 millisecond, which is what I was aiming for.

    //get window scroll position prior to animation
    //so we can keep this position during animation
    var xPosition = window.scrollX || window.pageXOffset || document.body.scrollLeft;
    var yPosition = window.scrollY || window.pageYOffset || document.body.scrollTop;
    
    //NOTE:restoreTimer needs to be global variable
    //start the restore timer
    restoreTimer = setInterval(function() {
        window.scrollTo(xPosition, yPosition);
    }, 1);
    
    //animate the element emt
    emt.animate({
        left: "toggle",
        top: "toggle",
        width: "toggle",
        height: "toggle"
    }, 500, function() {
        //when animation completes, we stop the timer
        clearInterval(restoreTimer);
    });
    

    ANOTHER SOLUTION that worked: Based on the answer by Mohammad Anini under this post to enable/disable scrolling, I also found that a modified version of code as below worked.

    //get current scroll position
    var xPosition = window.scrollX || window.pageXOffset || document.body.scrollLeft;
    var yPosition = window.scrollY || window.pageYOffset || document.body.scrollTop;
    
    //disable scrolling
    window.onscroll = function() {
        window.scrollTo(xPosition, yPosition);
    };
    
    //animate and enable scrolling when animation is completed
    emt.animate({
        left: "toggle",
        top: "toggle",
        width: "toggle",
        height: "toggle"
    }, 500, function() {
        //enable scrolling when animation is done
        window.onscroll = function() {};
    });
    
    0 讨论(0)
  • 2020-11-21 05:38

    As of Chrome 56 and other modern browsers, you have to add passive:false to the addEventListener call to make preventDefault work. So I use this to stop scrolling on mobile:

    function preventDefault(e){
        e.preventDefault();
    }
    
    function disableScroll(){
        document.body.addEventListener('touchmove', preventDefault, { passive: false });
    }
    function enableScroll(){
        document.body.removeEventListener('touchmove', preventDefault, { passive: false });
    }
    
    0 讨论(0)
  • 2020-11-21 05:39

    This solution will maintain the current scroll position whilst scrolling is disabled, unlike some which jump the user back to the top.

    It's based on galambalazs' answer, but with support for touch devices, and refactored as a single object with jquery plugin wrapper.

    Demo here.

    On github here.

    /**
     * $.disablescroll
     * Author: Josh Harrison - aloof.co
     *
     * Disables scroll events from mousewheels, touchmoves and keypresses.
     * Use while jQuery is animating the scroll position for a guaranteed super-smooth ride!
     */
    
    ;(function($) {
    
        "use strict";
    
        var instance, proto;
    
        function UserScrollDisabler($container, options) {
            // spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36
            // left: 37, up: 38, right: 39, down: 40
            this.opts = $.extend({
                handleKeys : true,
                scrollEventKeys : [32, 33, 34, 35, 36, 37, 38, 39, 40]
            }, options);
    
            this.$container = $container;
            this.$document = $(document);
            this.lockToScrollPos = [0, 0];
    
            this.disable();
        }
    
        proto = UserScrollDisabler.prototype;
    
        proto.disable = function() {
            var t = this;
    
            t.lockToScrollPos = [
                t.$container.scrollLeft(),
                t.$container.scrollTop()
            ];
    
            t.$container.on(
                "mousewheel.disablescroll DOMMouseScroll.disablescroll touchmove.disablescroll",
                t._handleWheel
            );
    
            t.$container.on("scroll.disablescroll", function() {
                t._handleScrollbar.call(t);
            });
    
            if(t.opts.handleKeys) {
                t.$document.on("keydown.disablescroll", function(event) {
                    t._handleKeydown.call(t, event);
                });
            }
        };
    
        proto.undo = function() {
            var t = this;
            t.$container.off(".disablescroll");
            if(t.opts.handleKeys) {
                t.$document.off(".disablescroll");
            }
        };
    
        proto._handleWheel = function(event) {
            event.preventDefault();
        };
    
        proto._handleScrollbar = function() {
            this.$container.scrollLeft(this.lockToScrollPos[0]);
            this.$container.scrollTop(this.lockToScrollPos[1]);
        };
    
        proto._handleKeydown = function(event) {
            for (var i = 0; i < this.opts.scrollEventKeys.length; i++) {
                if (event.keyCode === this.opts.scrollEventKeys[i]) {
                    event.preventDefault();
                    return;
                }
            }
        };
    
    
        // Plugin wrapper for object
        $.fn.disablescroll = function(method) {
    
            // If calling for the first time, instantiate the object and save
            // reference. The plugin can therefore only be instantiated once per
            // page. You can pass options object in through the method parameter.
            if( ! instance && (typeof method === "object" || ! method)) {
                instance = new UserScrollDisabler(this, method);
            }
    
            // Instance already created, and a method is being explicitly called,
            // e.g. .disablescroll('undo');
            else if(instance && instance[method]) {
                instance[method].call(instance);
            }
    
        };
    
        // Global access
        window.UserScrollDisabler = UserScrollDisabler;
    
    })(jQuery);
    
    0 讨论(0)
提交回复
热议问题