移动端定位内的元素有滑动事件,为了阻止底层元素滑动,添加touchmove.prevent,结果导致内部的也无法滑动,如何解决?

遮罩层里有个名单,由于太多,所以使用overflow来部分显示,移动端touchmove时,会让遮罩外的元素也跟着滚动,所以给遮罩添加了阻止默认事件,但是它内部的名单也不能滚动了,该怎样解决呢,

在线问题重现(麻烦f12以手机模式查看)

//大致结构
<div class="mask" @touchmove.prevent>
    <h2>Todos:</h2>
    <ol>
      <li v-for="todo in todos">
        //内容
      </li>
    </ol>
</div>
<div class='content'>
 //底层文字
</div>

给mask加上 @touchmove.prevent 时的效果,内部和底层都不能滑动
图片描述
不加时的效果,内部和底层都能滑动
图片描述


希望实现的效果:
内部能滑动,底层不能滑动
该如何实现呢?

阅读 13.6k
3 个回答

直接上代码了哈,header是相当于你的遮罩

/ 解决遮罩滚动时,底层页面也跟着滚动的问题/

var startY, endY; // 两个变量用来确定滑动方向
$('#header').on('touchstart', function(e) {
    startY = e.targetTouches[0].pageY; // 垂直起点
});

$('#header').on('touchmove', function(e) {
    endY = e.targetTouches[0].pageY; // 垂直落点
    // 如果默认事件是可以取消的,则滑动到底部时,只允许向上滑动;滑动到顶部时,只允许向下滑动
    if(e.cancelable && (($(this)[0].scrollHeight == ($(this).scrollTop() + $(this)[0].clientHeight) && endY < startY) || ($(this).scrollTop() == 0 && endY > startY))) {
        e.preventDefault(); 
        return;
    }
});
新手上路,请多包涵

当你打开遮罩层的时候body设置overflow: hidden;关闭遮罩层的时候设置overflow: scroll;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题