震动API在移动端部分可用:仅Android Chrome/Firefox支持且须HTTPS环境、用户手势同步触发;iOS Safari完全禁用,桌面浏览器基本不支持。

震动API在移动端是否可用?
只有在支持 navigator.vibrate() 且用户已与页面交互(如点击、触摸)后的上下文中,震动才可能生效。桌面浏览器基本不支持;iOS Safari 完全禁用该 API(无论是否用户触发),Android Chrome 和 Firefox 移动版支持但需满足条件。
- 必须是 HTTPS 环境(HTTP 页面直接忽略调用)
- 必须由用户手势(
click、touchend)触发,不能在setTimeout或页面加载后自动执行 - iOS 设备上
navigator.vibrate()始终返回false,调用无效 —— 别白费力气适配
如何正确调用 navigator.vibrate() 实现按钮反馈?
不是所有“震动”都适合按钮反馈:太长会干扰,太短感知不到。推荐使用短脉冲(10–50ms),并确保只在必要时触发(比如确认操作、错误提示)。
- 单次震动:
navigator.vibrate(20)(震动 20ms) - 序列震动(如“滴滴”):
navigator.vibrate([30, 40, 30])(震 30ms → 停 40ms → 震 30ms) - 停止震动:
navigator.vibrate(0)或navigator.vibrate([]) - 调用前务必检查支持性:
if ("vibrate" in navigator),否则会报TypeError
为什么按钮点了没反应?常见失效原因
绝大多数“没震动”问题不是代码写错,而是环境或时机不满足。尤其容易被忽略的是:Chrome 从 2021 年起要求震动必须在用户激活(user activation)窗口期内调用 —— 即点击后立即执行,延迟哪怕 100ms 也可能失效。
- 用了
async函数或await等待 Promise,导致震动调用脱离用户手势流 - 在
fetch回调里调用震动(此时已无用户激活状态) - 按钮绑了
preventDefault()但未处理 touch/click 兼容,导致部分 Android 触摸事件未触发激活 - 震动参数为
0、null、undefined或负数,会被静默忽略
替代方案:没有震动时怎么保持反馈一致性?
既然 iOS 不支持、桌面不可用、部分 Android 也受限,纯靠震动做反馈风险太高。建议组合使用视觉 + 声音(如有权限)+ 微动效:
立即学习“前端免费学习笔记(深入)”;
- 按钮添加
transform: scale(0.98)+transition模拟按压感 - 配合
AudioContext播放极短提示音(注意需用户手势触发 AudioContext) - 对 iOS 用户,可 fallback 到
haptics(仅限 PWA 添加到主屏幕后,且需navigator.hapticActuator?.notification('success')) - 永远把震动当作「增强」而非「必需」——关键操作反馈不能只依赖它



















