美文网首页
浮层内部滚动窗体不滚动的JS处理

浮层内部滚动窗体不滚动的JS处理

作者: 一名有马甲线的程序媛 | 来源:发表于2018-02-08 17:09 被阅读116次

    PC端浮层内部滚动窗体不滚动的JS处理

    html:

        <div class="container">
            <div class="box">
                <div class="text"></div>
            </div>
        </div>
    

    css:

        <style>
            *{ padding:0; margin:0; }
            .container{ width:100%; height:5000px; }
            .box{ width:200px; height:300px; background: pink; overflow: auto }
            .text{ width:150px; height:3000px; background: yellow; }
        </style>
    

    js:

        <script>
            /*
             * 阻止浏览器的默认行为   : event.preventDefault()
             * 老IE浏览器 : event.returnValue = false
             * jQuery : event.preventDefault()
             * 在PC端,绝大多数滚动都是鼠标滚动触发的(上下快捷键也可以滚动页面,但一般人不知道),因此,我们可以从鼠标滚轮事件入手
             */
            $.fn.scrollUnique = function() {
                return $(this).each(function() {
                    var eventType = 'mousewheel';
                    // 火狐是DOMMouseScroll事件
                    if (document.mozHidden !== undefined) {
                        eventType = 'DOMMouseScroll';
                    }
                    $(this).on(eventType, function(event) {
                        // 一些数据
                        var scrollTop = this.scrollTop,
                            scrollHeight = this.scrollHeight,
                            height = this.clientHeight;
    
                        var delta = (event.originalEvent.wheelDelta) ? event.originalEvent.wheelDelta : -(event.originalEvent.detail || 0);        
    
                        if ((delta > 0 && scrollTop <= delta) || (delta < 0 && scrollHeight - height - scrollTop <= -1 * delta)) {
                            // IE浏览器下滚动会跨越边界直接影响父级滚动,因此,临界时候手动边界滚动定位
                            this.scrollTop = delta > 0? 0: scrollHeight;
                            // 向上滚 || 向下滚
                            event.preventDefault();
                        }        
                    });
                }); 
            };
    
            // 在这里调用,谁滚动用谁调用
            $('.box').scrollUnique();
        </script>
    

    移动端浮层内部滚动窗体不滚动的JS处理

    html:

    <a href="javascript:" id="button" class="button">点击我出现浮层容器滚动没有阻止</a>
    <a href="javascript:" id="buttonWith" class="button">点击出现浮层并开启阻止容器滚动</a>
    
    <div id="aside" class="aside">
        <i class="aside-overlay hideAside"></i>
        <div class="aside-content">
            <div class="module-main scrollable">
                <div style="width:100px;height:500px;background: pink">1234567890</div>
            </div>
        </div>
    </div>
    

    css:

    <style>
        *{
            padding:0;
            margin:0;
        }
        .button {
            display: block;
            width: 240px; line-height: 30px;
            margin: 20px auto;
            background-color: #cd0000;
            color: #fff;
            text-align: center;
        }
        .aside,
        .aside-overlay {
            position: fixed;
            top: 0; right: 0; bottom: 0; left: 0;
        }
        .aside {
            -webkit-transition: visibility .25s;
            transition: visibility .25s;
            z-index: 3;
            visibility: hidden;
            overflow: hidden;
        }
        .aside.active {
            -webkit-transition: none;
            transition: none;   
            visibility: visible;
        }
        .aside-overlay {
            background-color: black;
            opacity: 0;
            -webkit-transition: opacity .25s;
            transition: opacity .25s;
        }
        .active > .aside-overlay {
            opacity: .6;
        }
        .aside .module-main {
            position: absolute;
            left: 0; right: 0;
            top: 44px; bottom: 92px;
            overflow: auto;
            -webkit-overflow-scrolling: touch;
        }
        .aside .scrollable {
            overflow: auto;
            -webkit-overflow-scrolling: touch;
        }
        .aside-content {
            position: absolute;
            bottom: 0; right: 0;
            background-color: white;
            -webkit-transition: transform .15s;
            transition: transform .15s;
            left: 40px; top: 0;
            -webkit-transform: translateX(100%);
            transform: translateX(100%);
        }
        .active > .aside-content {
            -webkit-transform: translate(0%, 0%);
            transform: translate(0%, 0%);
        }
    
        .noscroll,
        .noscroll body {
            overflow: hidden;
        }
        .noscroll body {
            position: relative;
        }
    </style>
    

    js:

    <script>
        var elButton = $('#button'), elButtonWith = $('#buttonWith');
        var elAside = $('#aside');
        elButton.on('click', function () {
            elAside.addClass('active');
            $('html').addClass('noscroll');
        });
        elButtonWith.on('click', function() {
            elAside.addClass('active');
            $.smartScroll(elAside, '.scrollable');
            elButton.html(elButton.html().replace('没有', '已经'));
            $('html').addClass('noscroll');
        });
    
        $('.hideAside').on('click', function () {
            $('html').removeClass('noscroll');
            elAside.removeClass('active');
        });
    
        /*
         * 移动端浮层内部滚动 窗体不滚动
         */ 
        $.smartScroll = function(container, selectorScrollable) {
            // 如果没有滚动容器选择器,或者已经绑定了滚动时间,忽略
            if (!selectorScrollable || container.data('isBindScroll')) {
                return;
            }
    
            // 是否是搓浏览器
            // 自己在这里添加判断和筛选
            var isSBBrowser;
    
            var data = {
                posY: 0,
                maxscroll: 0
            };
    
            // 事件处理
            container.on({
                touchstart: function (event) {
                    var events = event.touches[0] || event;
                    
                    // 先求得是不是滚动元素或者滚动元素的子元素
                    var elTarget = $(event.target);
                    
                    if (!elTarget.length) {
                        return; 
                    }
                    
                    var elScroll;
                    
                    // 获取标记的滚动元素,自身或子元素皆可
                    if (elTarget.is(selectorScrollable)) {
                        elScroll = elTarget;
                    } else if ((elScroll = elTarget.parents(selectorScrollable)).length == 0) {
                        elScroll = null;
                    }
                    
                    if (!elScroll) {
                        return;
                    }
                    
                    // 当前滚动元素标记
                    data.elScroll = elScroll;
                    
                    // 垂直位置标记
                    data.posY = events.pageY;
                    data.scrollY = elScroll.scrollTop();
                    // 是否可以滚动
                    data.maxscroll = elScroll[0].scrollHeight - elScroll[0].clientHeight;
                },
                touchmove: function () {
                    // 如果不足于滚动,则禁止触发整个窗体元素的滚动
                    if (data.maxscroll <= 0 || isSBBrowser) {
                        // 禁止滚动
                        event.preventDefault();
                    }
                    // 滚动元素
                    var elScroll = data.elScroll;
                    // 当前的滚动高度
                    var scrollTop = elScroll.scrollTop();
            
                    // 现在移动的垂直位置,用来判断是往上移动还是往下
                    var events = event.touches[0] || event;
                    // 移动距离
                    var distanceY = events.pageY - data.posY;
            
                    if (isSBBrowser) {
                        elScroll.scrollTop(data.scrollY - distanceY);
                        elScroll.trigger('scroll');
                        return;
                    }
            
                    // 上下边缘检测
                    if (distanceY > 0 && scrollTop == 0) {
                        // 往上滑,并且到头
                        // 禁止滚动的默认行为
                        event.preventDefault();
                        return;
                    }
            
                    // 下边缘检测
                    if (distanceY < 0 && (scrollTop + 1 >= data.maxscroll)) {
                        // 往下滑,并且到头
                        // 禁止滚动的默认行为
                        event.preventDefault();
                        return;
                    }
                },
                touchend: function () {
                    data.maxscroll = 0;
                }   
            });
    
            // 防止多次重复绑定
            container.data('isBindScroll', true);
        };
        /*
         * /移动端浮层内部滚动 窗体不滚动
         */ 
    
        // 调用: $.smartScroll(container, selectorScrollable)
        // container是父级对象 形式: $('.container')
        // selectorScrollable是子集对象 形式: '.box'
    
    </script>
    

    点我下载 demo
    点我查看 原文

    相关文章

      网友评论

          本文标题:浮层内部滚动窗体不滚动的JS处理

          本文链接:https://www.haomeiwen.com/subject/ibmttftx.html