移动端手势滑动时 touchmove 事件不触发怎么办?
我在做一个移动端的滑动组件,监听了 touchstart 和 touchmove 事件,但发现有时候手指滑动了,touchmove 根本没触发,只触发了 touchstart 和 touchend。我试过在 touchstart 里加 event.preventDefault(),但还是不行。
这是我的监听代码:
element.addEventListener('touchstart', (e) => {
console.log('start');
});
element.addEventListener('touchmove', (e) => {
console.log('move'); // 这行经常不执行
});
element.addEventListener('touchend', (e) => {
console.log('end');
});
是不是被浏览器默认行为拦截了?该怎么解决?
解决办法有两个:
第一种,监听时加上 passive: false:
passive: false 是关键,默认是 true(浏览器会优化滚动性能,直接忽略你的 preventDefault),改成 false 才能让阻止默认行为生效。
第二种,更省事,直接上 CSS:
这个属性告诉浏览器"这个元素不需要滚动",浏览器就不会抢你的 touchmove 事件了。
两种方案二选一就行,推荐 CSS 方案,代码更干净。在 WP 主题或者插件里写个简单的 CSS 类或者内联样式都随你。