navigator.vibrate可用于按钮点击等操作触发短促震动以增强反馈,支持毫秒数或偶数长度震动模式数组,需检测兼容性、绑定用户手势、控制时长并尊重无障碍偏好。

可以用 navigator.vibrate 在用户点击按钮、切换开关或完成某项操作时触发短促震动,增强交互反馈。但要注意兼容性、权限逻辑和用户体验细节。
基础用法:传入毫秒数或震动模式数组
最简单的方式是传一个数字,表示震动持续时间(毫秒):
navigator.vibrate(50); // 震动 50 毫秒也可以传入数组,实现更复杂的节奏(如“震-停-震”):
navigator.vibrate([100, 50, 80]); // 震100ms → 停50ms → 震80ms注意:数组长度必须为偶数(震/停交替),且不能超过 10 个值,否则会被截断或忽略。
兼容性与检测:先判断是否支持
不是所有浏览器都支持,尤其 iOS Safari 从始至终不支持该 API(即使在 PWA 中)。使用前务必检测:
if ('vibrate' in navigator) {navigator.vibrate(30);
} else {
// 降级处理,比如播放提示音或添加视觉反馈
}
另外,部分安卓浏览器可能仅在用户手势(如 click、touchend)触发的上下文中才允许震动,异步回调中调用会静默失败。
实际集成建议:绑定在用户可感知的操作上
震动不宜滥用,推荐用于明确的主动操作,例如:
- 按钮点击(尤其是提交、确认、删除类操作)
- 滑动开关 toggle 切换成功后
- 表单验证通过并聚焦下一个字段时(轻震一次)
避免在滚动、hover 或自动轮播中触发;震动时长建议控制在 10–100ms,过长易引起不适。
注意事项与常见问题
以下情况会导致 vibrate 失效或无响应:
- 用户系统已关闭振动功能(API 不报错,但无效果)
- 页面未获得焦点(如切到后台标签页)
- 在非用户手势事件中调用(如 setTimeout、fetch 回调)
- iOS 设备(Safari 及所有 WebView 均不支持)
可结合 matchMedia('(prefers-reduced-motion: reduce)') 尊重用户的无障碍偏好,必要时跳过震动。

















