How to disable scrolling temporarily?

前端 未结 30 2545
萌比男神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:39

    I have similar issue on touch devices. Adding "touch-action: none" to the element resolved the issue.

    For more information. Check this out:-

    https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action

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

    I'm sorry to answer an old post but I was looking for a solution and came across this question.

    There are many workarounds for this issue to still display the scrollbar, like giving the container a 100% height and an overflow-y: scroll styling.

    In my case I just created a div with a scrollbar which I display while adding overflow: hidden to the body:

    function disableScroll() {
        document.getElementById('scrollbar').style.display = 'block';
        document.body.style.overflow = 'hidden';
    }
    

    The element scrollbar must have this styles:

    overflow-y: scroll; top: 0; right: 0; display: none; height: 100%; position: fixed;
    

    This shows a grey scrollbar, hope it helps future visitors.

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

    Cancelling the event's as in the accepted answer is a horrible method in my opinion :/

    Instead I used position: fixed; top: -scrollTop(); below.

    Demo: https://jsfiddle.net/w9w9hthy/5/

    From my jQuery popup project: https://github.com/seahorsepip/jPopup

    //Freeze page content scrolling
    function freeze() {
        if($("html").css("position") != "fixed") {
            var top = $("html").scrollTop() ? $("html").scrollTop() : $("body").scrollTop();
            if(window.innerWidth > $("html").width()) {
                $("html").css("overflow-y", "scroll");
            }
            $("html").css({"width": "100%", "height": "100%", "position": "fixed", "top": -top});
        }
    }
    
    //Unfreeze page content scrolling
    function unfreeze() {
        if($("html").css("position") == "fixed") {
            $("html").css("position", "static");
            $("html, body").scrollTop(-parseInt($("html").css("top")));
            $("html").css({"position": "", "width": "", "height": "", "top": "", "overflow-y": ""});
        }
    }
    

    This code takes, width, height, scrollbar and pagejump issues into consideration.

    Possible issues resolved with above code:

    • width, when setting position fixed the html element width can be smaller then 100%
    • height, same as above
    • scrollbar, when setting position fixed the page content no longer has a scrollbar even when it had a scrollbar before resulting in a horizontal pagejump
    • pagejump, when setting position fixed the page scrollTop is no longer effective resulting in a vertical pagejump

    If anyone has any improvements to above page freeze/unfreeze code let me know so I can add those improvements to my project.

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

    Here's a really basic way to do it:

    window.onscroll = function () { window.scrollTo(0, 0); };
    

    It's kind of jumpy in IE6.

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

    This is the simplest solution I got so far. And believe me I tried all the others and this is the easiest one. It works great on Windows devices, which pushes the page from the right to have room for the system scrollbar and IOS devices which don't require space for their scrollbars in the browsers. So by using this you wont need to add padding on the right so the page doesn't flicker when you hide the overflow of the body or html with css.

    The solution is pretty simple if you think about it. The idea is to give the window.scrollTop() the same exact position at the moment that a popup is opened. Also change that position when the window resizes ( as the scroll position changes once that happens ).

    So here we go...

    First lets create the variable that will let you know that the popup is open and call it stopWindowScroll. If we don't do this then you'll get an error of an undefined variable on your page and set it to 0 - as not active.

    $(document).ready(function(){
        stopWindowScroll = 0;
    });
    

    Now lets make the open popup function witch can be any function in your code that triggers whatever popup you are using as a plugin or custom. In this case it will be a simple custom popup with a simple document on click function.

    $(document).on('click','.open-popup', function(){
        // Saving the scroll position once opening the popup.
        stopWindowScrollPosition = $(window).scrollTop();
        // Setting the stopWindowScroll to 1 to know the popup is open.
        stopWindowScroll = 1;
        // Displaying your popup.
        $('.your-popup').fadeIn(300);
    });
    

    So the next thing we do is create the close popup function, which I repeat again can be any function you already have created or are using in a plugin. The important thing is that we need those 2 functions to set the stopWindowScroll variable to 1 or 0 to know when it's open or closed.

    $(document).on('click','.open-popup', function(){
        // Setting the stopWindowScroll to 0 to know the popup is closed.
        stopWindowScroll = 0;
        // Hiding your popup
        $('.your-popup').fadeOut(300);
    });
    

    Then lets create the window.scroll function so we can prevent the scrolling once the stopWindowScroll mentioned above is set to 1 - as active.

    $(window).scroll(function(){
        if(stopWindowScroll == 1) {
             // Giving the window scrollTop() function the position on which
             // the popup was opened, this way it will stay in its place.
             $(window).scrollTop(stopWindowScrollPosition);
        }
    });
    

    Thats it. No CSS required for this to work except your own styles for the page. This worked like a charm for me and I hope it helps you and others.

    Here is a working example on JSFiddle:

    JS Fiddle Example

    Let me know if this helped. Regards.

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

    The scroll event cannot be canceled. But you can do it by canceling these interaction events:
    Mouse & Touch scroll and Buttons associated with scrolling.

    [Working demo]

    // left: 37, up: 38, right: 39, down: 40,
    // spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36
    var keys = {37: 1, 38: 1, 39: 1, 40: 1};
    
    function preventDefault(e) {
      e.preventDefault();
    }
    
    function preventDefaultForScrollKeys(e) {
      if (keys[e.keyCode]) {
        preventDefault(e);
        return false;
      }
    }
    
    // modern Chrome requires { passive: false } when adding event
    var supportsPassive = false;
    try {
      window.addEventListener("test", null, Object.defineProperty({}, 'passive', {
        get: function () { supportsPassive = true; } 
      }));
    } catch(e) {}
    
    var wheelOpt = supportsPassive ? { passive: false } : false;
    var wheelEvent = 'onwheel' in document.createElement('div') ? 'wheel' : 'mousewheel';
    
    // call this to Disable
    function disableScroll() {
      window.addEventListener('DOMMouseScroll', preventDefault, false); // older FF
      window.addEventListener(wheelEvent, preventDefault, wheelOpt); // modern desktop
      window.addEventListener('touchmove', preventDefault, wheelOpt); // mobile
      window.addEventListener('keydown', preventDefaultForScrollKeys, false);
    }
    
    // call this to Enable
    function enableScroll() {
      window.removeEventListener('DOMMouseScroll', preventDefault, false);
      window.removeEventListener(wheelEvent, preventDefault, wheelOpt); 
      window.removeEventListener('touchmove', preventDefault, wheelOpt);
      window.removeEventListener('keydown', preventDefaultForScrollKeys, false);
    }
    

    UPDATE: fixed Chrome desktop and modern mobile browsers with passive listeners

    0 讨论(0)
提交回复
热议问题