不能。HTML 本身无震动能力,必须通过 JavaScript 调用 navigator.vibrate(),且仅 Android 移动端浏览器(如 Chrome、Firefox)支持;iOS Safari 完全不支持,须降级为视觉反馈。

HTML 能直接调用震动吗
不能。HTML 本身没有震动能力,navigator.vibrate() 是 JavaScript API,必须通过 JS 调用,且只在支持 Vibration API 的移动端浏览器中生效(如 Chrome for Android、Firefox for Android)。iOS Safari 完全不支持该 API —— 这是开发者最容易忽略的前提。
检查是否可用,必须先判断:
if ('vibrate' in navigator) {
navigator.vibrate(200); // 震动 200ms
} else {
console.warn('Vibration API not supported');
}
为什么 navigator.vibrate() 不生效
常见失效原因不是代码写错,而是触发时机或权限问题:
- 必须由用户手势(如
click、touchend)触发,页面自动 onload 或定时器里调用会静默失败 - Chrome 从 96 版本起要求页面处于「前台活跃状态」,切到后台再切回来可能需重新触发一次手势才能恢复权限
- 部分国产安卓浏览器(如 UC、QQ 浏览器)虽有
vibrate方法,但返回true却无实际震动,需实机测试 - 参数为
0、false、空数组或null时,部分机型会清空正在执行的震动队列,而非“不震”
navigator.vibrate() 参数怎么传才可靠
接受两种格式:单个数字(毫秒)或数字数组(交替震动/暂停):
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
立即学习“前端免费学习笔记(深入)”;
-
navigator.vibrate(150):震动 150ms,最常用、兼容性最好 -
navigator.vibrate([200, 100, 150]):震 200ms → 停 100ms → 震 150ms;总时长超 5000ms 会被截断 - 传
[0]或0在多数 Android 上无反应,但可用来终止持续震动(如长按场景) - 避免传负数、
NaN、字符串数字(如"200"),某些旧版 WebView 会报TypeError
iOS 设备有没有替代方案
没有标准替代。Safari 不暴露任何硬件震动控制接口,Haptic Feedback(触感反馈)仅限 WebKit 内的原生应用(如 PWA 添加了 apple-mobile-web-app-capable 仍无效)。
能做的只有降级处理:
- 对 iOS 用户完全跳过震动逻辑,改用视觉反馈(如按钮缩放 + class 切换)
- 用
matchMedia('(prefers-reduced-motion: reduce)')检测系统动效偏好,连视觉反馈也一并关闭 - 不要伪造「震动」音效——手机扬声器外放震动声既失真又干扰用户,尤其静音模式下会突然出声
真正要覆盖 iOS 用户的震动体验,唯一可行路径是转成原生 App 或使用 Capacitor/Cordova 插件桥接系统 API。


















