移動端防止窗體滾動

基於jquery防止窗體滾動css

$.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.originalEvent.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($('.rule-popup'), '.rule-content');

轉自張鑫旭博客web移動端浮層滾動阻止window窗體滾動JS/CSS處理jquery

相關文章
相關標籤/搜索