在做卡片左右滑动删除功能时,发现手指抬起瞬间会触发下方按钮的点击事件。试过给滑动层加pointer-events: none,但阻止了滑动操作。后来用event.stopPropagation()包裹触摸事件也没用,有没有更好的解决办法?
card.addEventListener('touchstart', (e) => {
e.preventDefault();
// 滑动逻辑
}, { passive: false });
现在问题是当快速滑动后松手,下方的”删除”按钮还是会偶尔被点击,有没有遗漏的关键点?
血泪教训告诉我,最靠谱的解决办法是加一个延迟判断机制。具体做法是:在用户手指抬起时,先不立刻触发点击事件,而是用一个小延迟(比如 150 毫秒)来判断刚才的操作是不是滑动。如果是滑动,就直接阻止点击事件。
代码可以这样写:
这里的重点是用
isSwiping标志位来记录用户是否触发了滑动。如果检测到滑动,就直接拦截掉后续的点击行为。这个方案的关键是touchmove和touchend的配合,单独靠stopPropagation是不够的,因为点击穿透通常是浏览器的默认行为导致的。还有一个小技巧,如果你发现某些设备上仍然有问题,可以在
touchend里手动给目标元素加个临时的pointer-events: none,然后用setTimeout在几百毫秒后恢复。比如:这种方法虽然有点粗暴,但在一些极端场景下特别管用。总之,核心思路就是通过标志位和延迟判断来区分滑动和点击,别让浏览器自己去猜用户的意图,不然它经常会猜错。