为什么移动端TouchEnd事件在快速滑动后不触发?
在移动端做卡片滑动交互时,发现当快速滑动手指离开屏幕后,TouchEnd事件偶尔不触发,导致卡片位置没及时更新。代码已经绑定了TouchEvent,但测试时发现:
尝试给卡片加了CSS过渡效果后问题更明显,比如这个样式:
.slide-card {
transition: transform 0.2s;
touch-action: pan-x;
}
用Chrome DevTools模拟触摸没问题,但真机测试时,特别是快速左右滑动后突然停住,事件监听器偶尔收不到TouchEnd。试过把transition改成will-change: transform也没解决,求大佬指点是哪里出问题了?
别用
touchend了,改用touchcancel和touchend一起监听。快速滑动时,系统经常会触发touchcancel而不是touchend,特别是在有CSS过渡效果的情况下。另外,把
passive设置为false,阻止浏览器默认行为,这样能减少事件丢失的概率。代码可以直接这么写:记得在
handleTouchCancel里也处理卡片位置更新的逻辑,不然快速滑动时位置会错乱。这种方式我已经在几个项目里用过了,基本能解决这个问题。如果还是有问题,建议试试 PointerEvent,比 TouchEvent 稳定一些,不过兼容性要注意一下。