【问题标题】:Disable scrolling on body in overlay modal view在覆盖模式视图中禁用正文滚动
【发布时间】:2014-03-31 12:31:43
【问题描述】:

我正在使用this script 来显示和隐藏模态视图,但我想在模态视图打开后禁用正文滚动,并在关闭时禁用它。

我试图修改 JS 代码,但它可以工作,但它破坏了打开动画。这是修改后的代码:

(function() {
var triggerBttn = document.getElementById( 'trigger-overlay' ),
    overlay = document.querySelector( 'div.overlay' ),
    bodyTag = document.querySelector( 'body' ),
    closeBttn = overlay.querySelector( 'button.overlay-close' );
    transEndEventNames = {
        'WebkitTransition': 'webkitTransitionEnd',
        'MozTransition': 'transitionend',
        'OTransition': 'oTransitionEnd',
        'msTransition': 'MSTransitionEnd',
        'transition': 'transitionend'
    },
    transEndEventName = transEndEventNames[ Modernizr.prefixed( 'transition' ) ],
    support = { transitions : Modernizr.csstransitions };

function toggleOverlay() {

    if( classie.has( overlay, 'open' ) ) {
        classie.remove( overlay, 'open' );
        classie.add( overlay, 'close' );

        var onEndTransitionFn = function( ev ) {
            if( support.transitions ) {
                if( ev.propertyName !== 'visibility' ) return;
                this.removeEventListener( transEndEventName, onEndTransitionFn );
            }

            classie.remove( overlay, 'close' );
            classie.remove( bodyTag, 'noscroll' );
        };
        if( support.transitions ) {
            overlay.addEventListener( transEndEventName, onEndTransitionFn );
        }
        else {
            onEndTransitionFn();
        }
    }
    else if( !classie.has( overlay, 'close' ) ) {
        classie.add( overlay, 'open' );
        classie.add( bodyTag, 'noscroll' );
    }
}

triggerBttn.addEventListener( 'click', toggleOverlay );
closeBttn.addEventListener( 'click', toggleOverlay );})();

原始演示:jsfiddle

【问题讨论】:

    标签: javascript html scroll modernizr


    【解决方案1】:

    首先添加jquery。从https://jquery.com 下载并使用<script src="jquery.min.js"></script> 将其添加到您的文档中。

    然后,在文档底部(带有动画的文档)添加以下片段:

    <script>
        $(document).ready(function() {
            $('#trigger-overlay').click(function() {
                $('html').css('overflow', 'hidden');
                $('body').bind('touchmove', function(e) {
                    e.preventDefault()
                });
            });
            $('.overlay-close').click(function() {
                $('html').css('overflow', 'scroll');
                $('body').unbind('touchmove');
            });
        });
    </script>
    

    我已经使用来自https://github.com/codrops/FullscreenOverlayStyles 的代码和动画Huge inc 进行了尝试。这将防止动画打开时滚动文本。

    更新了我的答案,第一个答案确实允许在触摸设备上滚动。

    【讨论】:

      【解决方案2】:

      已经在这里讨论过:Prevent BODY from scrolling when a modal is opened

      它正在使用引导程序,但同样的解决方案仍然可以工作。第二个答案比公认的要好一些。它建议在模式打开时切换主体上的一个类,使主体overflow: hidden;

      【讨论】:

      • 如果您查看我的代码,您会发现我尝试实现此解决方案,但正如我提到的那样它不起作用,它会破坏动画
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 2014-07-16
      相关资源
      最近更新 更多