Vue手势滑动方向检测不准怎么办?
在移动端用Vue做卡片滑动切换时,检测滑动方向总是出错。比如向右滑应该删除卡片,但经常反向触发。我试过记录touchstart和touchend的坐标差,但计算出来的方向不准。
代码是这样写的:
<template>
<div
@touchstart="handleTouchStart"
@touchend="handleTouchEnd"
>可滑动区域</div>
</template>
<script>
export default {
methods: {
handleTouchStart(e) {
this.startX = e.touches[0].clientX;
this.startY = e.touches[0].clientY;
},
handleTouchEnd(e) {
const endX = e.changedTouches[0].clientX;
const endY = e.changedTouches[0].clientY;
if(endX - this.startX > 20) {
console.log('向右滑');
} else if(this.startX - endX > 20) {
console.log('向左滑');
}
}
}
}
</script>
问题出现在快速滑动时方向判断会反转,有时候横向滑动还会触发纵向逻辑。明明设置了20像素的阈值,但实际滑动距离明显超过却没反应...
建议你在
touchmove事件里做方向检测,而不是等到touchend才算。这样可以实时跟踪滑动趋势,避免误判。另外加个斜率计算,防止斜着滑触发错误方向。下面是改过的代码:
重点是加了个
isHorizontal标记,在touchmove时就确定主要滑动方向。这样即使用户手抖带出点斜线,也不会影响最终判断。阈值还是保持20像素,但增加了方向判定的准确性。最后吐槽一句,前端的手势识别有时候真让人头大,不过这种处理方式在我们项目里已经挺稳定了。