如何准确获取移动端滑动时的瞬时速度?
我在做移动端图片轮播,想根据用户手指滑动的速度来决定是否自动翻页。但用 touchstart 和 touchend 算出来的速度总是不准,有时候轻轻一划反而触发了快速翻页。
我试过用时间差和位移计算速度,但感觉忽略了加速度或者中间的滑动轨迹。下面是我目前的简化代码:
const handleTouchEnd = (e) => {
const endTime = Date.now();
const deltaX = e.changedTouches[0].clientX - startX;
const timeDiff = endTime - startTime;
const velocity = Math.abs(deltaX / timeDiff); // 单位:px/ms
if (velocity > 0.5) console.log('快速滑动');
};
这个 velocity 阈值调来调去都不稳定,是不是应该采样更多 touchmove 的点?有没有更靠谱的做法?
正确做法是在 touchmove 里采样多个点计算瞬时速度。我后来改成了这样:
几个关键点:
1. 在 touchmove 里持续采样,记录最近5个点的速度
2. 最后取平均值而不是单次计算结果
3. 阈值我一般设在 0.3 左右比较合适
这个方案比两点计算稳定多了,实测能准确区分快滑和慢滑。记得在 touchend 里要清空采样数组,不然下次滑动会带着上次的数据。
正确的做法是采样 touchmove 的最后几个点,算瞬时速度才靠谱。复制这个:
核心思路就是只看最近 100ms 内的滑动轨迹,这样不管用户最后停多久都不影响判断。positions 数组记得在 touchstart 时清空,不然会出 bug。
阈值 0.3 到 0.5 之间自己调,不同设备像素密度不一样,有条件的话可以用 devicePixelRatio 做个适配,不过一般直接调个大概值也够用了。