移动端 touch 事件延迟怎么解决?

UP主~艳敏 阅读 82

我在做移动端页面时,发现点击按钮有明显延迟,大概300ms左右,用户体验很差。查了下说是浏览器默认的双击缩放导致的。

试过加 user-scalable=no 到 viewport,但 Safari 好像不认这个了。也试过用 touchstart 代替 click,但这样又没法处理长按和滑动冲突的问题。

有没有靠谱的方案既能消除延迟,又不影响其他手势操作?比如像 FastClick 那种,但现在是不是有更好的原生方法?

我来解答 赞 14 收藏
二维码
手机扫码查看
2 条解答
司马柯豫
直接给你答案:

在 CSS 里加 touch-action: manipulation,或者用 touch-action: manipulation 配合 pointer-events 事件处理。现在浏览器基本都支持这个,比 FastClick 简洁多了。

/* 方法1: CSS 方案 */
button {
touch-action: manipulation;
}

/* 方法2: 如果还要兼容更老的浏览器,用 FastClick */
if ('ontouchstart' in window) {
FastClick.attach(document.body);
}


viewport 里那个 meta 标签现在确实不太管用了,touch-action 是 W3C 标准,Safari Chrome 都认。唯一要注意的是别和其他手势冲突,如果你的页面有滚动/缩放需求,那就得精细化控制覆盖范围了。
点赞
2026-03-14 10:07
司徒付楠
移动端这个300ms延迟确实是老问题了,性能上确实恶心。现在的确有好几种解决方案:

1. 原生方案是用标签禁用双击缩放:


但你说得对,Safari现在会忽略user-scalable=no,所以不全靠谱。

2. 更好的原生方法是CSS touch-action属性,这货是专为解决这个问题设计的:
.btn {
touch-action: manipulation;
}

这个告诉浏览器这个元素只需要轻触操作,不用等双击判断,兼容性还不错。

3. 如果非要更老的浏览器支持,可以用FastClick的polyfill方案,但现代浏览器没必要了,性能上反而增加开销。

个人建议直接用CSS方案,简单高效。如果遇到特别老的安卓机再考虑polyfill。别用touchstart代替click,会引发一堆手势冲突的坑,我当年就被这坑惨了。
点赞 2
2026-03-06 15:00