audio标签是HTML5原生音频嵌入方式,需加controls才显示控件;必须用source提供MP3、OGG等多格式回退以确保兼容;preload推荐设为metadata,autoplay须配合muted才可能生效。
audio 标签是当前唯一被所有现代浏览器原生支持的音频嵌入方式,不需要插件、不依赖 Flash,直接写 HTML 就能播。但光写 <audio src="a.mp3"></audio> 很大概率在某些浏览器里静音、卡住或干脆不显示控件——问题不在代码错,而在格式、属性和加载时机没对齐。很多人写了 <audio src="song.mp3"></audio> 却看不到任何按钮,是因为默认不渲染控件。用户无法点击播放,audio 就只是个“隐身”元素。
controls 属性:<audio src="song.mp3" controls></audio>
controls 时,该元素仍可被 JavaScript 控制(比如 play()),但页面上完全不可见、不可交互controls,再用 JS 绑定行为Chrome 和 Safari 支持 MP3,Firefox 和 Opera 默认不支持;Firefox 原生支持 OGG,Safari 却不认。只放一个 src 等于主动放弃约 20%–30% 的用户。
<source> 提供多格式回退:<audio controls> <source src="song.mp3" type="audio/mpeg"> <source src="song.ogg" type="audio/ogg"> 您的浏览器不支持 audio 元素。</audio>
type 属性不是可选的——它让浏览器跳过解码失败的格式,避免卡在 loading 状态preload 不是“要不要预加载”,而是“预加载什么”。设错会导致移动端用户流量白跑,或桌面端点击后等待太久。
preload="none":完全不预加载,适合长音频或用户触发概率低的场景(如文章末尾的配音)preload="metadata":只加载时长、封面、采样率等元信息,控件能立刻显示总时长和可拖拽范围,推荐作为默认值preload="auto":浏览器可能下载整个文件,尤其在移动网络下容易触发“流量警告”或被拦截,慎用preload 时,各浏览器行为不一致:Chrome 默认 auto,Safari 默认 metadata
想实现“页面打开就自动播放”?现实是:autoplay 在 Chrome、Edge、Firefox、Safari 中全部受限。即使加了 autoplay muted,一旦用户后续取消静音,play() 仍会抛出 NotAllowedError。
muted 才可能自动播放:<audio src="beep.mp3" autoplay muted></audio>
play() 也受此限制autoplay 做关键功能(如语音提示),它随时可能失效,应提供显式播放按钮兜底preload、controls、source 和用户交互时机里,漏掉任何一个,都会让声音在某个设备上彻底消失。