让网页开口说话:HTML5 `<audio>` 一行代码到全流程避坑
58
0
0
下面这份「现查现用」手册,从“丢进去就能播”到“自动播放被浏览器拦截怎么办”一条龙写完,直接复制即可上线。
1. 最快上线模板
<audio controls>
<source src="bgm.mp3" type="audio/mpeg">
<source src="bgm.ogg" type="audio/ogg">
您的浏览器不支持音频。
</audio>- 多放几个
<source>,浏览器从上到下挑自己认识的格式,兼容性一次搞定。 - MP3 覆盖率 95%+,再补一个 OGG 就能把 Firefox 老版本也照顾到。
2. 属性一句话速记
| 属性 | 作用 | 小贴士 |
|---|---|---|
controls | 原生播放条 | 想自定义 UI 就自己画按钮,再调 JS |
autoplay | 自动播放 | 移动端几乎全被屏蔽,得先静音或等用户点击 |
loop | 循环 | 背景音乐刚需 |
muted | 默认静音 | 先静音 → 自动播放成功 → 再手动开声音 |
preload="none" | 不预加载 | 省移动流量,点播放才拉数据 |
3. 自动播放老被拦截?三招破解
先静音后出声(成功率最高)
const a = document.createElement('audio'); a.src = 'bgm.mp3'; a.muted = true; // 第一步:静音 a.play().then(()=>{ // 第二步:播放 a.muted = false; // 第三步:再打开声音 }).catch(e=>console.log('拦截',e));等用户第一次互动(保底方案)
document.body.addEventListener('click',()=>{ a.play(); // 用户点过任意地方,浏览器放行 },{once:true});提示用户手动开启(体验兜底)
a.play().catch(()=>{ toast('请点右下角播放按钮开启音乐'); });
4. 常用 JS 接口一图背完
audio.play() // 播放,返回 Promise
audio.pause() // 暂停
audio.currentTime = 30 // 跳到 30 s
audio.volume = 0.3 // 音量 0~1
audio.playbackRate = 1.25 // 1.25 倍速
audio.ended // 只读,布尔,是否播完
audio.duration // 只读,总时长(s)5. 事件监听大全(做进度条、歌词同步全靠它们)
| 事件 | 触发时机 | 典型用途 |
|---|---|---|
loadedmetadata | 拿到时长 | 渲染总时间 |
timeupdate | 播放中 250 ms 一次 | 更新进度条 |
ended | 播放完毕 | 下一首、循环 |
waiting | 缓冲卡顿 | 显示加载动画 |
canplay | 缓冲够可继续播放 | 隐藏加载动画 |
示例:自制进度条
audio.addEventListener('timeupdate',()=>{
const pct = audio.currentTime / audio.duration * 100;
bar.style.width = pct + '%';
});6. 格式与码率怎么选
| 格式 | 是否专利 | 浏览器支持 | 备注 |
|---|---|---|---|
| MP3 | 是 | 全平台 | 通用保底 |
| OGG Vorbis | 否 | Chrome、Firefox、Edge | 开源,文件小 |
| AAC(m4a) | 是 | Safari、iOS 优先 | 苹果生态首选 |
| WAV | 否 | 全平台 | 无损 = 体积爆炸,仅短音效 |
码率建议
- 背景音乐 64~96 kbps 足够;
- 有声小说 48 kbps 也能听;
- 音乐流媒体 128~192 kbps 平衡流量与音质。
7. 移动端额外注意
- 省电模式:部分 ROM 会禁止后台播放,前端无解,引导用户加白名单。
- 流量焦虑:默认给
preload="none",播放前再load()。 - 静音自动播放后,记得弹“是否开启声音”浮层,避免用户以为没声是 Bug。
8. 打包带走一句话
“先静音,再互动,再出声;格式 MP3+OGG,事件 timeupdate 做进度,流量记得 preload=none。”
把这段口诀写便签,下次音频需求 10 分钟收工。
0
快来点个赞吧
发表评论
评论列表