欢迎光临散文网 会员登陆 & 注册

移动端解决弹出层滑动到底部后,继续滑动会带动主页面滑动的问题。

2023-01-09 14:29 作者:雨中豆芽  | 我要投稿

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>

移动端解决弹出层滑动到底部后,继续滑动会带动主页面滑动的问题。的评论 (共 条)

分享到微博请遵守国家法律