javascript - 在覆盖模态视图中禁用主体滚动

标签 javascript html scroll modernizr

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

我试图修改 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

最佳答案

首先添加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 .这将防止在动画打开时滚动文本。

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

关于javascript - 在覆盖模态视图中禁用主体滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22079352/

相关文章:

javascript - 自定义应用程序的动态高度

javascript - 如何在每次单击按钮时增加/减少视口(viewport)元值(初始比例、最大比例或最小比例)?

javascript - 如何屏蔽一个 div 并使其所有子元素不可编辑

reactjs - 如何描述类型滚动事件?

javascript - 如何使用 jQuery 对象作为委托(delegate)方法的参数

javascript - Material UI 中的嵌套按钮 : how to disable ripple effect of container button while clicking on a child button?

javascript - 如何从对象中选择某些属性?

java - 在 JSP 自定义标记中为 HTML 实现 "window manager"

objective-c - UICollectionView 在滚动时响应?

javascript - 我怎么知道我什么时候停止滚动?