我在做一个移动端的H5页面,发现点按钮的时候总感觉“卡一下”才触发点击事件,体验很不好。查了下说是300ms延迟的问题,但我不太确定是不是这个原因。
我试过直接用 click 事件,也试过引入 fastclick 库,但有时候还是有延迟,尤其是在安卓机上。有没有更靠谱的解决办法?或者是不是我哪里写错了?
document.getElementById('myBtn').addEventListener('click', function() {
console.log('clicked');
});
首先检查你是不是踩了这些坑:
1. 用了但没有设置width=device-width
2. CSS里给按钮加了:hover效果(移动端会先触发touch再触发hover)
3. 事件绑定在document.body上导致事件冒泡延迟
更靠谱的解决方案是touch事件结合click事件,我给你个完整方案:
具体来说,这个方案有几点关键:
1. {passive: false} 让你能调用preventDefault()
2. 用transform代替hover效果,性能更好
3. touchstart比touchend响应更快
4. 保留click是为了兼容PC端调试
如果还有问题,检查下是不是:
1. 主线程被阻塞(比如同步ajax请求)
2. 页面有大量重绘/回流
3. 安卓机型特有的性能问题(可以试试requestAnimationFrame)
我前两天刚用这套方案解决了个类似问题,测试下来iOS和安卓主流机型都能立即响应。要是还不行你可能需要上performance API分析下具体卡在哪了。
简单说下原因,早期移动端浏览器为了区分"单击"和"双击缩放",在click事件前会等300ms判断用户是不是要双击。虽然现在iOS和很多安卓浏览器已经优化了,但有些安卓机还是有这个问题。
你说用了fastclick还有延迟,可能是这几个原因:
第一,fastclick初始化时机不对,要确保在DOM加载后执行。第二,有些安卓机型上fastclick本身就有兼容性问题。第三,可能不是300ms延迟,而是你的CSS没处理好,比如按钮没有及时反馈视觉变化。
给你一个我目前用得最稳的方案,不用引入额外库:
在HTML头部meta标签里加上这行:
关键是
user-scalable=no禁止缩放,现代浏览器检测到这个就会自动干掉300ms延迟。然后CSS里加上:
这个CSS属性专门用来告诉浏览器"这元素不需要双击缩放",直接触发点击。
如果还有延迟感,可能是你的代码逻辑里有耗时操作,或者没给按钮加
:active状态的视觉反馈。用户有时候觉得卡是因为点了没反应,加个按下变色的效果体验会好很多。这套方案我在好几个项目里都用过,比fastclick靠谱,而且零依赖。