navigator.vibrate()需满足设备支持、用户手势触发、前台https环境及系统设置,推荐用navigator.vibrate(150),避开ios限制并搭配视觉/听觉降级方案。

可以直接用 navigator.vibrate() 给关键点击加震动,但不是写上就响——它依赖设备能力、用户手势、页面状态和系统设置,缺一不可。重点是把它嵌进“用户真点了”的那一刻,同时准备好降级方案。
确认支持性与触发前提
仅判断 'vibrate' in navigator 不够,iOS Safari 会返回 true 却静默失败。必须双重校验:
if ('vibrate' in navigator && typeof navigator.vibrate === 'function')- 震动调用必须出现在
click、touchend等用户真实手势事件处理函数中,不能放在setTimeout、Promise.then或页面加载完成回调里 - 页面需处于前台激活状态(非后台标签页),且运行在 HTTPS 环境下
选择合适震动参数
简单反馈优先用单数字,兼顾兼容性与感知清晰度:
- 推荐
navigator.vibrate(150):150ms 短震,多数 Android 设备响应稳定,iOS ≥16.4 且「触感反馈」开启时也可生效 - 避免复杂模式如
[100, 50, 100]:部分低端 Android 无法识别短停顿,可能合并成一次长震;数组总时长勿超 5000ms,项数建议 ≤5 且必须为偶数(震/停交替) - 不传
0、负数或空数组来“主动停止”——除非有明确排队控制需求,日常无需干预
集成到关键操作中
震动是增强型反馈,不能替代视觉或逻辑确认:
- 适用场景:表单提交成功、开关切换完成、扫码识别命中、删除确认弹窗点击“确定”
- 禁用场景:滚动监听、hover 效果、自动轮播、非用户主动触发的 Toast 显示
- 搭配无障碍偏好:
matchMedia('(prefers-reduced-motion: reduce)').matches为真时跳过震动,尊重用户设置
务必准备降级方案
iOS Safari 全面不支持(即使 ≥16.4 也受限于系统设置和首次交互历史),所以震动永远只是可选层:
- 视觉降级:按钮点击时添加微缩放动画 + 背景色瞬变
- 听觉降级:播放一段 100ms 内的轻提示音(需用户手势后首次解锁音频上下文)
- 文字/图标降级:Toast 提示“已确认”或图标旁加打钩动效










