移动端点击延迟问题
移动端 300ms 点击延迟的原因及解决方案
问题
移动端点击事件有 300ms 延迟,为什么会出现这个问题?如何解决?
解答
延迟原因
移动端浏览器为了支持双击缩放功能,在用户点击后会等待 300ms,判断用户是否会进行第二次点击。如果 300ms 内没有第二次点击,才会触发 click 事件。
解决方案
1. 禁用页面缩放
通过 meta 标签禁用网页缩放功能:
<meta name="viewport" content="user-scalable=no">
2. 设置 ideal viewport
将 viewport 设置为理想视口宽度:
<meta name="viewport" content="width=device-width">
3. 使用 FastClick 库
引入 FastClick 库来消除延迟:
import FastClick from 'fastclick';
FastClick.attach(document.body);
点击穿透问题
延迟还可能导致点击穿透现象。当在元素上监听 touchstart 事件并隐藏该元素时,300ms 后触发的 click 事件会”穿透”到下层元素:
// 可能导致穿透的代码
element.addEventListener('touchstart', () => {
element.style.display = 'none'; // 隐藏元素
// 300ms 后 click 事件会触发下层元素
});
关键点
- 300ms 延迟是为了判断用户是否执行双击缩放操作
- 设置
width=device-width可以让浏览器认为页面已适配移动端,从而取消延迟 - 使用
touchstart替代click时需注意点击穿透问题 - 现代浏览器在设置合适的 viewport 后会自动取消延迟,无需额外处理
目录