How to disable scrolling temporarily?

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

    Do it simply by adding a class to the body:

    .stop-scrolling {
      height: 100%;
      overflow: hidden;
    }
    

    Add the class then remove when you want to re-enable scrolling, tested in IE, FF, Safari and Chrome.

    $('body').addClass('stop-scrolling')
    

    For mobile devices, you'll need to handle the touchmove event:

    $('body').bind('touchmove', function(e){e.preventDefault()})
    

    And unbind to re-enable scrolling. Tested in iOS6 and Android 2.3.3

    $('body').unbind('touchmove')
    
    0 讨论(0)
  • 2020-11-21 05:17

    According to the galambalazs post I would add support for touch devices, allowing us to touch but no scroll up or down:

    function disable_scroll() {
       ...
       document.ontouchmove = function(e){ 
            e.preventDefault(); 
       }
    }
    
    function enable_scroll() {
       ...
       document.ontouchmove = function(e){ 
         return true; 
       }
    }
    
    0 讨论(0)
  • 2020-11-21 05:18

    I was looking out for a solution to this problem but was not satisfied with the any of the above solutions (as of writing this answer), so I came up with this solution..

    CSS

    .scrollDisabled {   
        position: fixed;
        margin-top: 0;// override by JS to use acc to curr $(window).scrollTop()
        width: 100%;
    }
    

    JS

    var y_offsetWhenScrollDisabled=0;
    
    function disableScrollOnBody(){
        y_offsetWhenScrollDisabled= $(window).scrollTop();
        $('body').addClass('scrollDisabled').css('margin-top', -y_offsetWhenScrollDisabled);
    }
    function enableScrollOnBody(){
        $('body').removeClass('scrollDisabled').css('margin-top', 0);
        $(window).scrollTop(y_offsetWhenScrollDisabled);
    }
    
    0 讨论(0)
  • 2020-11-21 05:18

    I'm using showModalDialog, for showing secondary page as modal dialog.

    to hide main window scrollbars:

    document.body.style.overflow = "hidden";
    

    and when closing modal dialog, showing main window scrollbars:

    document.body.style.overflow = "scroll";
    

    to access elements in main window from dialog:

    parent.document.getElementById('dialog-close').click();
    

    just for anybody searching about showModalDialog:(after line 29 of original code)

    document.getElementById('dialog-body').contentWindow.dialogArguments = arg;
    document.body.style.overflow = "hidden";//****
    document.getElementById('dialog-close').addEventListener('click', function(e) {
        e.preventDefault();
        document.body.style.overflow = "scroll";//****
        dialog.close();
    });
    
    0 讨论(0)
  • 2020-11-21 05:19

    How about this? (If you're using jQuery)

    var $window = $(window);
    var $body = $(window.document.body);
    
    window.onscroll = function() {
        var overlay = $body.children(".ui-widget-overlay").first();
    
        // Check if the overlay is visible and restore the previous scroll state
        if (overlay.is(":visible")) {
            var scrollPos = $body.data("scroll-pos") || { x: 0, y: 0 };
            window.scrollTo(scrollPos.x, scrollPos.y);
        }
        else {
            // Just store the scroll state
            $body.data("scroll-pos", { x: $window.scrollLeft(), y: $window.scrollTop() });
        }
    };
    
    0 讨论(0)
  • 2020-11-21 05:22

    A simple solution that worked for me (disabling window scrolling temporarily).

    Based on this fiddle: http://jsfiddle.net/dh834zgw/1/

    the following snippet (using jquery) will disable the window scroll:

     var curScrollTop = $(window).scrollTop();
     $('html').toggleClass('noscroll').css('top', '-' + curScrollTop + 'px');
    

    And in your css:

    html.noscroll{
        position: fixed;
        width: 100%;
        top:0;
        left: 0;
        height: 100%;
        overflow-y: scroll !important;
        z-index: 10;
     }
    

    Now when you remove the modal, don't forget to remove the noscroll class on the html tag:

    $('html').toggleClass('noscroll');
    
    0 讨论(0)
提交回复
热议问题