组元素滚动穿透的解决方案

文章讨论了在Vue应用中,如何处理带有遮罩层和需要动态滚动的父组件,确保子组件滚动条不会穿透到父组件。通过监听touchstart和touchmove事件,判断手指移动方向并限制滚动,避免滚动卡顿问题。
摘要由CSDN通过智能技术生成

1.如果是有遮罩层的,直接禁止父元素滚动条overflow-y: hidden;

2.如果没有遮罩层,也要动态滚动父组件,也要滚动子组件并且子组件的滚动条禁止穿透到父组件,怎么解决?

//answerFirstRef滚动限制
        answerFirstRef.value.addEventListener('touchstart', e => {
          startX = e.changedTouches[0].pageX // 存储初始触摸位置的 X 坐标
          startY = e.changedTouches[0].pageY // 存储初始触摸位置的 Y 坐标
        })
        //answerFirstRef滚动限制
        answerFirstRef.value.addEventListener('touchmove', e => {
          const deltaY = e.changedTouches[0].pageY - startY
          const deltaX = e.changedTouches[0].pageX - startX

          // 计算手指移动方向的角度
          const angle = Math.atan2(Math.abs(deltaY), Math.abs(deltaX)) * (180 / Math.PI)

          // 如果手指移动角度小于 45 度,认为是水平移动,不执行阻止行为
          if (angle < 45) {
            return
          }

          // 禁止向上滚动溢出
          if ((e.cancelable && deltaY > 0 && answerFirstRef.value.scrollTop <= 0) || answerFirstRef.value.scrollTop == null) {
            e.preventDefault()
          }

          // 禁止向下滚动溢出
          if ((e.cancelable && deltaY < 0 && answerFirstRef.value.scrollTop + answerFirstRef.value.clientHeight + 2 >= answerFirstRef.value.scrollHeight) || answerFirstRef.value.scrollTop == null) {
            e.preventDefault()
          }
        })

这是当滚动条在顶部以及在底部时候就会穿透,只要判断顶部是否触底以及底部是否触底判断,来让手指事件取消,但是如果同时出现X和Y轴都有滚动,那么就要限制X 和Y轴一起判断,当角度小于45度时候就不要限制手指事件,这样用户在滚动才不会卡住。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值