出处:掘金
原作者:江城开朗的豌豆
在移动端,为了让用户能双击缩放(Double Tap to Zoom),浏览器在点击事件上设置了一个 300ms 的等待期,用户点了之后,浏览器会先等 300ms,确认没有第二次点击后,才触发事件
问题:按钮点击反应慢
touchstart 替代 click(慎用!)button.addEventListener('touchstart', () => {
console.log('这次反应够快了吧!');
});
touchstart 会在手指刚触碰屏幕时就触发,可能导致误触(比如用户只是想滑动,却误点了按钮)<meta> 标签,禁止缩放<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
这样浏览器就知道这个页面不需要双击缩放,自然就不会有 300ms 延迟了
// 安装:npm install fastclick
import FastClick from 'fastclick';
FastClick.attach(document.body);
touch 事件模拟 click,并立即触发,绕过浏览器的等待机制touch 事件的情况touch-action(现代浏览器推荐)button {
touch-action: manipulation; /* 告诉浏览器:这个元素只允许滚动和连续触摸,不需要双击缩放 */
}
随着移动端生态的成熟,现代浏览器(Chrome、Safari等)在 2015 年后逐步优化了这一机制:
<meta viewport> 且 width=device-width,大部分浏览器会自动禁用 300ms 延迟但如果你的用户还在用老版本浏览器(比如某些国产安卓机的内置浏览器),可能还是会有这个问题
<meta viewport> + touch-action: manipulation(最简单、性能最好)touchstart 替代 click,容易引发误触问题