必须同时设置 autoplay 和 muted 才能实现自动播放,否则现代浏览器会因策略限制拒绝播放并抛出 NotAllowedError;移动端仍可能忽略 autoplay,JS 调用 play() 需处理 Promise 失败;多格式 fallback(OGG 优先、MP3 次之)和 preload="metadata" 更可靠;用户手势交互是触发播放的必要前提。
直接用 <audio> 标签就能播,但不加 controls 你根本看不到按钮,不加 muted + autoplay 就别指望自动响——现代浏览器全拦了。
autoplay 还不响因为浏览器策略强制要求:自动播放只允许在静音状态下触发。哪怕你写了 autoplay,没配 muted,play() 调用也会被拒绝并抛出 NotAllowedError。
autoplay muted,顺序无关autoplay,哪怕静音——这是硬限制,不是 bugplay(),它返回 Promise,记得 .catch(e => console.log(e.name)) 捕获失败原因MP3 在 Safari/Chrome/Edge 里稳,OGG 在 Firefox/Opera 里更可靠,WAV 兼容性最差且体积大。单靠一种格式,总有用户听不到。
<source>,按兼容性排序:MP3 放最后,OGG 放前面(Firefox 优先选第一个支持的)<source> 必须带 type 属性,比如 type="audio/ogg",否则浏览器可能跳过preload 设成 "auto" 真的有用吗基本没用,尤其在移动设备上。浏览器会主动忽略它,以节省流量和电量。
立即学习“前端免费学习笔记(深入)”;
preload="metadata" 是较稳妥的选择:只加载时长、封面、采样率等信息,控件能立刻显示进度条起点preload="none" 适合页面上有十几个音频、且用户大概率只点一两个的场景preload="auto",Chrome DevTools 的 Network 面板里也常看到音频资源延迟加载,说明浏览器没买账原生 <audio> 不是“点了就响”的傻瓜组件,事件时机和状态判断稍不注意就失效。
ended 事件只在自然播放完时触发,用户拖动到末尾不会触发;要用 timeupdate + currentTime === duration 补充判断volume 属性写入后立即读取,可能还是旧值——得监听 volumechange 才能确认已生效play() 不报错但也不重放,得先 pause() 再 currentTime = 0,再 play()
最麻烦的其实是「用户没交互前不能播」这条铁律——哪怕你把所有格式、属性、事件都配齐,只要没经过 click/touchstart 等用户手势触发,后续所有 play() 都注定失败。这点没法绕,只能设计交互流程去适配。