移动端页面滑动事件穿透问题及其解决方案

滑动事件穿透:

在一个可滚动的列表页中打开弹窗,底部的页面理论上是不可滚动的,但是当滑动弹窗时,底部页面会跟随滚动,这就是所谓的页面滚动穿透的问题。


解决方案一:

当弹窗显示时,在父元素上添加fix类来禁用滚动;当弹窗隐藏时,移除fix类。

        .fix{
            height: 100%;
            overflow: hidden;
        }

缺点:

当弹出蒙层时,禁用了html和body的滚动条,滚动列表的滚动位置会丢失,会重置到没有滚动的状态,需要js进行还原。

  $(function () {
        var scrollTop;
        $('.show').click(function () {
            scrollTop = document.documentElement.scrollTop;// 记录scrollTop的值
            console.log(scrollTop);
            $('.model').show();
            $('.content').addClass('fix');
        });
        $('.hide').click(function () {
            $('.model').hide();
            $('.content').removeClass('fix');
            document.documentElement.scrollTop = scrollTop;// 设置scrollTop的值
        })
    })

demo完整代码:




    
    滚动穿透
    
    
    


长城(Great Wall),又称万里长城,是中国古代的军事防御工程,是一道高大、坚固而连绵不断的长垣,用以限隔敌骑的行动。长城不是一道单纯孤立的城墙,而是以城墙为主体,同大量的城、障、亭、标相结合的防御体系。 长城修筑的历史可上溯到西周时期,发生在首都镐京(今陕西西安)的著名的典故“烽火戏诸侯”就源于此。春秋战国时期列国争霸,互相防守,长城修筑进入第一个高潮,但此时修筑的长度都比较短。秦灭六国统一天下后,秦始皇连接和修缮战国长城,始有万里长城之称[1] 。明朝是最后一个大修长城的朝代,今天人们所看到的长城多是此时修筑。[2] 长城资源主要分布在河北、北京、天津、山西、陕西、甘肃、内蒙古、黑龙江、吉林、辽宁、山东、河南、青海、宁夏、新疆等15个省区市。期中陕西省是中国长城资源最为丰富的省份,境内长城长度达1838千米[3-10] 。根据文物和测绘部门的全国性长城资源调查结果,明长城总长度为8851.8千米,秦汉及早期长城超过1万千米,总长超过2.1万千米。[11] 1961年3月4日,长城被国务院公布为第一批全国重点文物保护单位[12] 。1987年12月,长城被列入世界文化遗产。[13]


解决方案二:阻止touchmove默认事件
通过阻止弹窗的touchmove默认事件禁用滚动实现
源码(基于方案一中demo的dom结构):

$(function () {
var modal = document.getElementsByClassName('modal')[0]; // 弹窗dom对象
modal.addEventListener('touchmove', function(e) {
e.preventDefault();
}, false);
})

缺点:

弹窗中里不能有其它需要滚动的内容,如大段文字需要固定高度,显示滚动条也会被阻止。

解决方案三:设置 html,body{overflow:hidden;}

在PC和移动端都能禁止掉下层的滚动。

缺点:

网页超出窗口部分不可滑动


总结:使用方案一。





你可能感兴趣的:(前端解决方案)