移动端解决弹出层滑动到底部后,继续滑动会带动主页面滑动的问题。
1,问题:弹出层有滑动的内容,滑动到底部后,继续滑动会触发主页面也滑动,向上滑动也会出现此问题
2,解决:如果弹出层是全覆盖主页面,那就好办了,直接出现弹出层时,主页面高度设为100vh,overflow设为hidden,关闭弹出层时,则主页面恢复正常设置。能达到效果。如果弹出层未全覆盖主页面,就不能那么做了,需要利用e.preventDefault()来阻止滑动事件,这需要判断何时阻止,何时不阻止,那就是判断弹出层是否滑到最底部或者最顶部,利用容器高度clientHeight和内容物高度scrollHeight之差可得到弹出层的最大滑动距离,达到后,可阻止默认事件,解决问题。
<script>
let init = {
data: { //数据初始化
startY: 0, //触摸到窗体时垂直位置标记(touchstart)
startScrollTop: 0, //每次触摸窗体时的滚动距离(touchstart)
endScrollTop: 0, //元素当前的滚动距离(touchmove)
maxScroll: 0 //下边缘距离(元素滚动maxScroll就到底啦)
},
/touchstart发生的事件
begin: function (event) {
init.data.startY = event.targetTouches[0].pageY; init.data.startScrollTop = event.currentTarget.scrollTop; init.data.maxScroll = this.scrollHeight - this.clientHeight; //下边缘距离(元素滚动maxScroll就到底啦
$(this).on('touchmove', init.move);
},
//touchmove发生的事件
move: function (event) {
let endScrollTop = this.scrollTop;
let endY = event.targetTouches[0].pageY; //元素当前的垂直位置标记,与触摸到窗体时垂直位置标记相差来确定向上滑还是向下滑
let direction = endY - init.data.startY;
if(direction > 0 && endScrollTop === 0){
init.zuzhi(); //向上滑并且当前的滚动距离为0,说明到达上边缘,阻止默认事件
}
if(direction < 0 && endScrollTop + 1 >= init.data.maxScroll){
init.zuzhi(); //向下滑并且当前的滚动距离即将达到endScrollTop,说明即将到达下边缘,阻止默认事件
}
$(this).on('touchend', init.end);
},
end: function () {
init.data.maxScroll = 0;
},
zuzhi: function (e) {
event.preventDefault();
return;
},
</script>