在网页中实现音频播放早已不再需要Flash插件,HTML5提供的audio元素配合JavaScript的Audio API,可以完成播放、暂停、音量调节、进度控制等几乎所有常见的音频操作。本文将从基础用法入手,逐步讲解Audio API的核心属性、方法和事件,并给出一个自定义播放器的完整实现思路。

一、audio元素的基础用法
最简单的方式是直接在HTML中使用<audio>标签,设置controls属性后浏览器会渲染默认的播放控件。controls属性是一个布尔属性,写上即生效,不需要赋值。
<audio id="myAudio" src="music.mp3" controls>
您的浏览器不支持 audio 标签
</audio>audio元素支持多个常用属性:src指定音频文件地址;autoplay表示自动播放(现代浏览器通常会阻止这种行为);loop表示循环播放;preload控制预加载策略,可取值auto、metadata或none;muted表示初始静音。需要注意,autoplay在Chrome、Safari等浏览器中受自动播放策略限制,通常必须由用户交互触发才能出声。
如果需要兼容多种音频格式,可以使用<source>子元素提供多个来源,浏览器会按顺序选择第一个支持的格式:
<audio controls>
<source src="music.ogg" type="audio/ogg">
<source src="music.mp3" type="audio/mpeg">
您的浏览器不支持 audio 标签
</audio>浏览器对格式的支持各不相同,MP3的兼容性最好,OGG在Firefox和Chrome中表现出色,提供多个source可以最大程度保证各端用户都能正常播放。
二、JavaScript控制播放、暂停与音量
拿到audio元素之后,就可以用JavaScript直接操作它。播放调用play()方法,暂停调用pause()方法,判断是否暂停则读取paused属性。play()返回一个Promise,如果被自动播放策略拦截会进入rejected状态,建议捕获异常避免控制台报错。
var audio = document.getElementById('myAudio');
// 播放音频
function playAudio() {
var promise = audio.play();
if (promise !== undefined) {
promise.catch(function(error) {
console.log('播放被浏览器拦截,需要用户交互后重试');
});
}
}
// 暂停音频
function pauseAudio() {
audio.pause();
}音量控制依赖volume属性,取值范围是0到1的小数,超出范围会抛出IndexSizeError异常,因此设置前最好做边界判断。muted属性则用于静音切换,与音量为0的效果类似,但语义上更明确。
// 设置音量为 60%
function setVolume(value) {
if (value < 0) value = 0;
if (value > 1) value = 1;
audio.volume = value;
}
// 切换静音状态
function toggleMute() {
audio.muted = !audio.muted;
}需要注意volume属性只对当前这一个audio实例有效,如果页面中有多个音频要统一控制,需要逐个设置。另外浏览器并没有提供直接的"增大音量"接口,音量只能在这个0到1区间内衰减,无法超出系统原始音量。
三、播放进度获取与跳转
进度控制主要涉及三个属性:currentTime表示当前播放位置(秒),duration表示音频总时长(秒),seekable返回可跳转的时间范围。currentTime既可读也可写,给它赋值就能实现进度跳转。
// 获取播放进度
function showProgress() {
if (audio.duration) {
var percent = audio.currentTime / audio.duration * 100;
console.log('当前进度:' + percent.toFixed(1) + '%');
}
}
// 快进10秒
function forward10s() {
audio.currentTime = Math.min(audio.currentTime + 10, audio.duration);
}
// 快退10秒
function rewind10s() {
audio.currentTime = Math.max(audio.currentTime - 10, 0);
}duration在音频元数据加载完成之前是NaN,因此读取它之前应确认数据已就绪。一个可靠的时机是监听loadedmetadata事件,该事件触发说明时长、声道等信息已经可用。实现进度条时,可以把currentTime与duration的比值换算成百分比,驱动页面上的进度条宽度。
如果要监听播放位置的变化,可以使用timeupdate事件,浏览器在播放过程中会持续触发它,频率大约为每秒4到66次,足够刷新界面使用,不必自己用setInterval轮询。
四、常用事件监听与状态同步
Audio API提供了丰富的事件,用于同步界面状态。常用事件包括:play播放开始、pause暂停、ended播放结束、timeupdate位置更新、volumechange音量或静音变化、loadedmetadata元数据就绪、canplay可以播放、error加载出错。
audio.addEventListener('play', function() {
console.log('开始播放');
playBtn.textContent = '暂停';
});
audio.addEventListener('pause', function() {
console.log('已暂停');
playBtn.textContent = '播放';
});
audio.addEventListener('ended', function() {
console.log('播放结束');
playBtn.textContent = '重播';
});
audio.addEventListener('timeupdate', function() {
progressBar.style.width = (audio.currentTime / audio.duration * 100) + '%';
});
audio.addEventListener('error', function() {
console.log('音频加载失败:' + audio.error.code);
});error事件的detail属性是一个MediaError对象,其code字段可以区分错误类型:1表示加载被用户中止,2表示网络错误,3表示解码失败,4表示格式不支持。根据不同code给出不同提示,能显著改善用户体验。
五、实现一个自定义音频播放器
隐藏原生控件后,就可以用自定义按钮和进度条来控制音频。下面是一个完整的示例,把前面讲到的方法整合起来:
<div class="player">
<audio id="myAudio" src="music.mp3" preload="metadata"></audio>
<button id="playBtn">播放</button>
<button id="muteBtn">静音</button>
<div class="progress-wrap" id="progressWrap">
<div class="progress-bar" id="progressBar"></div>
</div>
<span id="timeLabel">00:00 / 00:00</span>
</div>
<script>
var audio = document.getElementById('myAudio');
var playBtn = document.getElementById('playBtn');
var muteBtn = document.getElementById('muteBtn');
var progressWrap = document.getElementById('progressWrap');
var progressBar = document.getElementById('progressBar');
var timeLabel = document.getElementById('timeLabel');
function formatTime(sec) {
var m = Math.floor(sec / 60);
var s = Math.floor(sec % 60);
return (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s);
}
playBtn.onclick = function() {
if (audio.paused) {
audio.play();
} else {
audio.pause();
}
};
muteBtn.onclick = function() {
audio.muted = !audio.muted;
muteBtn.textContent = audio.muted ? '取消静音' : '静音';
};
audio.addEventListener('timeupdate', function() {
if (audio.duration) {
progressBar.style.width = (audio.currentTime / audio.duration * 100) + '%';
timeLabel.textContent = formatTime(audio.currentTime) + ' / ' + formatTime(audio.duration);
}
});
// 点击进度条跳转
progressWrap.onclick = function(e) {
var rect = this.getBoundingClientRect();
var ratio = (e.clientX - rect.left) / rect.width;
if (audio.duration) {
audio.currentTime = ratio * audio.duration;
}
};
</script>这个示例去掉了controls属性,全部交互由自定义UI完成。点击进度条任意位置即可跳转的实现思路是:先获取进度条容器的屏幕坐标,用鼠标点击位置减去容器左边界,再除以容器总宽度得到比例,最后乘以总时长得到目标时间。如果要支持拖动跳转,再补充mousedown、mousemove、mouseup三个事件的组合即可。
此外还可以补充倍速播放功能,通过playbackRate属性设置,例如audio.playbackRate = 2即两倍速,部分浏览器最低支持到0.25倍速。所有这些接口组合起来,一个功能完善的网页音频播放器就成型了。开发中记得在移动端真机测试,不同平台对自动播放、后台播放的限制差异较大,针对iOS需要特别注意音频必须在用户点击的回调链中调用play()才能成功。
HTML5 Audio API音频控制JavaScript音频播放修改时间:2026-09-01 02:20:51