iphone 15 pro自定义震动需分三层设置:先在“设置→声音与触感”开启响铃/静音模式下的触感开关;再为电话、短信等通知进入对应项点击“触感”选择预设或“创建新振动模式”自定义节奏;最后通过“设置→辅助功能→触控→触感反馈”调节系统操作震动强度。

不能靠 navigator.vibrate 实现真正意义上的“自定义节奏触感”——它在 Web 环境中能力有限,且受系统严格限制。iOS Safari 完全不支持,Android 也只允许简单单次震动,数组形式的节奏序列兼容性差、易被截断或静默忽略。
哪些场景能安全用震动反馈
仅限用户主动触发的关键闭环操作,比如:
- 表单提交成功(非加载中、非校验失败)
- 开关切换完成(状态已持久化)
- 扫码识别命中(结果已确认并展示)
- 删除确认弹窗点击“确定”后(数据已移除)
怎么写才大概率有效
别传数组,别追求复杂节奏。用单数字最稳:
- navigator.vibrate(150):多数 Android 设备响应清晰,时长适中,用户感知明确
- 避免
[200, 100, 200]这类组合——低端机型可能合并成一次 500ms 震动,甚至直接忽略 - 不要传 0、负数或空数组;传
[]会尝试停止当前震动,但 Web 下基本无实际意义 - 总时长别超 5000ms,数组项别超 5 个,否则安卓系统大概率静默丢弃
必须绕过的坑
不是写了就能震,这些条件缺一不可:
- 检测要双重:
'vibrate' in navigator && typeof navigator.vibrate === 'function'—— 仅判断存在会误判 iOS - 首次调用必须由真实用户手势触发(
click、touchend),不能藏在setTimeout或 Promise 回调里 - 页面切到后台、标签页失焦时,震动会被系统强制取消
- iOS Safari 和所有 WKWebView 场景下,
navigator.vibrate永远无效,连错误都不抛
替代方案更实用
当震动不可用或效果打折时,优先补足其他反馈维度:
- CSS 动画:按钮微缩放 + 背景色过渡,响应快、全平台一致
- 轻量音效:短促提示音(需用户首次交互后才能自动播放)
- Toast 提示:带图标和 1.5 秒自动消失,信息明确不干扰
- 结合使用:震动失败时自动 fallback 到动画 + Toast,体验不掉线










