移动端手势滑动和点击冲突怎么解决?
我在做一个移动端的图片轮播组件,左右滑动切换图片,同时每张图片也能点击跳转。但经常出现滑动后还触发了点击事件,体验很奇怪。
试过在 touchstart 里记录位置,touchend 判断位移,如果超过阈值就阻止点击,但有时候还是会有误触。有没有更靠谱的处理方式?
现在判断逻辑大概是这样:
let startX, startY;
element.addEventListener('touchstart', e => {
startX = e.touches[0].clientX;
startY = e.touches[0].clientY;
});
element.addEventListener('touchend', e => {
const endX = e.changedTouches[0].clientX;
const endY = e.changedTouches[0].clientY;
const dx = Math.abs(endX - startX);
const dy = Math.abs(endY - startY);
if (dx > 10 || dy > 10) {
e.preventDefault(); // 想阻止点击
}
});
一个改进的方法是在
touchstart时设置一个标志位,在touchmove中根据滑动距离修改这个标志位,然后在touchend中根据这个标志位来决定是否阻止默认的点击行为。这样可以更准确地区分滑动和点击。试试下面的代码吧:
这样改之后,
isScrolling标志位会在用户滑动时被设置为true,从而在touchend中阻止点击事件。希望这个方法能帮到你!