- 基础版:一个最简单的HTML5音频播放器,功能有限。
- 功能增强版:使用JavaScript添加了自定义控制界面(播放/暂停、进度条、音量控制)。
- 完整版(带列表):一个功能更完整的播放器,包含播放列表和歌曲切换功能。
基础版:最简单的HTML5音频播放器
这个版本完全依赖浏览器自带的播放器控件,代码非常简单,适合快速嵌入。

(图片来源网络,侵删)
源代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">基础MP3播放器</title>
</head>
<body>
<h1>基础MP3播放器</h1>
<p>这个播放器使用浏览器默认的控件。</p>
<!--
<audio> 标签是HTML5中用于嵌入音频内容的核心元素。
src: 指定音频文件的路径。
controls: 属性,告诉浏览器显示默认的播放控件(播放/暂停、进度条、音量等)。
-->
<audio src="https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3" controls></audio>
</body>
</html>
如何使用
- 将上面的代码保存为一个
.html文件(player_basic.html)。 - 将你的MP3文件放在与HTML文件相同的目录下,并将
src属性的值改为你的MP3文件名(src="my_music.mp3")。 - 用浏览器打开这个HTML文件即可。
优点:代码量极少,无需任何JavaScript知识。 缺点:样式无法自定义,功能单一(不能自定义列表、歌词等)。
功能增强版:自定义控制界面
这个版本隐藏了浏览器原生控件,用我们自己设计的按钮和条条来控制播放,实现了更现代、更美观的界面。
源代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">自定义MP3播放器</title>
<style>
/* 基础样式 */
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f0f0;
}
.player-container {
background-color: #fff;
padding: 20px;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
width: 400px;
text-align: center;
}
h2 {
margin-top: 0;
}
/* 按钮样式 */
.controls button {
background-color: #007bff;
color: white;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
margin: 5px;
}
.controls button:hover {
background-color: #0056b3;
}
/* 进度条和音量条样式 */
input[type="range"] {
width: 100%;
margin: 10px 0;
}
.time-display {
display: flex;
justify-content: space-between;
font-size: 12px;
color: #666;
margin-top: -5px;
}
</style>
</head>
<body>
<div class="player-container">
<h2>自定义MP3播放器</h2>
<p id="song-title">SoundHelix Song</p>
<!-- 隐藏原生控件 -->
<audio id="audio-player" src="https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3"></audio>
<!-- 自定义控件 -->
<div class="controls">
<button id="play-pause-btn">播放</button>
</div>
<div class="progress-container">
<input type="range" id="progress-bar" value="0" min="0" max="100">
<div class="time-display">
<span id="current-time">0:00</span>
<span id="duration">0:00</span>
</div>
</div>
<div class="volume-container">
<label for="volume-bar">音量: </label>
<input type="range" id="volume-bar" value="50" min="0" max="100">
</div>
</div>
<script>
// 获取DOM元素
const audioPlayer = document.getElementById('audio-player');
const playPauseBtn = document.getElementById('play-pause-btn');
const progressBar = document.getElementById('progress-bar');
const volumeBar = document.getElementById('volume-bar');
const currentTimeSpan = document.getElementById('current-time');
const durationSpan = document.getElementById('duration');
const songTitle = document.getElementById('song-title');
// 播放/暂停功能
playPauseBtn.addEventListener('click', () => {
if (audioPlayer.paused) {
audioPlayer.play();
playPauseBtn.textContent = '暂停';
} else {
audioPlayer.pause();
playPauseBtn.textContent = '播放';
}
});
// 更新进度条
audioPlayer.addEventListener('timeupdate', () => {
// 计算进度百分比
const progressPercent = (audioPlayer.currentTime / audioPlayer.duration) * 100;
progressBar.value = progressPercent;
// 更新当前时间显示
const currentMinutes = Math.floor(audioPlayer.currentTime / 60);
const currentSeconds = Math.floor(audioPlayer.currentTime % 60).toString().padStart(2, '0');
currentTimeSpan.textContent = `${currentMinutes}:${currentSeconds}`;
});
// 当元数据加载完成后,获取总时长
audioPlayer.addEventListener('loadedmetadata', () => {
const durationMinutes = Math.floor(audioPlayer.duration / 60);
const durationSeconds = Math.floor(audioPlayer.duration % 60).toString().padStart(2, '0');
durationSpan.textContent = `${durationMinutes}:${durationSeconds}`;
songTitle.textContent = audioPlayer.src.split('/').pop(); // 使用文件名作为歌名
});
// 通过进度条跳转播放位置
progressBar.addEventListener('input', () => {
const goToTime = progressBar.value * audioPlayer.duration / 100;
audioPlayer.currentTime = goToTime;
});
// 音量控制
volumeBar.addEventListener('input', () => {
audioPlayer.volume = volumeBar.value / 100;
});
// 歌曲播放结束时,重置按钮状态
audioPlayer.addEventListener('ended', () => {
playPauseBtn.textContent = '播放';
progressBar.value = 0;
});
</script>
</body>
</html>
代码解释
-
HTML:
<audio>标签没有controls属性,这样浏览器就不会显示默认控件。- 我们添加了自定义的按钮
<button>和范围滑块<input type="range">,并给它们设置了id以便JavaScript能找到它们。 - 添加了显示当前时间和总时间的
<span>。
-
CSS:
(图片来源网络,侵删)样式部分用于美化我们创建的自定义控件,让它们看起来更美观。
-
JavaScript:
- 获取元素: 使用
document.getElementById()获取所有需要的HTML元素。 - 播放/暂停监听: 给播放/暂停按钮添加点击事件,如果音频是暂停状态 (
audioPlayer.paused),就调用play()方法并改变按钮文字;反之亦然。 timeupdate事件: 这个事件会在音频播放时持续触发,我们用它来更新进度条的值和当前时间的显示。loadedmetadata事件: 当音频的元数据(如时长)加载完成后触发,我们用它来获取并显示总时长。- 进度条跳转: 当用户拖动进度条时,
input事件触发,我们根据滑块的值计算出新的播放时间,并设置给audioPlayer.currentTime。 - 音量控制: 当音量滑块变化时,将滑块的值(0-100)转换为
audioPlayer.volume(0-1)并设置。
- 获取元素: 使用
完整版:带播放列表的MP3播放器
这是最实用的一版,它添加了播放列表,支持上一首/下一首切换,并且可以动态加载歌曲。
源代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">带播放列表的MP3播放器</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #121212;
color: #ffffff;
display: flex;
justify-content: center;
align-items: flex-start;
padding: 20px;
margin: 0;
min-height: 100vh;
}
.player-wrapper {
display: flex;
gap: 30px;
max-width: 900px;
width: 100%;
}
.player-container {
background-color: #1e1e1e;
padding: 25px;
border-radius: 15px;
box-shadow: 0 8px 16px rgba(0,0,0,0.3);
flex: 1;
}
.playlist-container {
background-color: #1e1e1e;
padding: 25px;
border-radius: 15px;
box-shadow: 0 8px 16px rgba(0,0,0,0.3);
width: 300px;
max-height: 500px;
overflow-y: auto;
}
h2 {
margin-top: 0;
color: #1db954;
text-align: center;
}
.now-playing {
text-align: center;
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 1px solid #444;
}
.now-playing h3 {
margin: 0;
font-size: 1.2em;
}
.now-playing p {
margin: 5px 0 0;
color: #aaa;
font-size: 0.9em;
}
.controls {
display: flex;
justify-content: center;
align-items: center;
gap: 15px;
margin-bottom: 20px;
}
.controls button {
background-color: #1db954;
color: white;
border: none;
padding: 12px;
border-radius: 50%;
cursor: pointer;
font-size: 16px;
width: 50px;
height: 50px;
display: flex;
align-items: center;
justify-content: center;
transition: background-color 0.2s;
}
.controls button:hover {
background-color: #1ed760;
}
.controls #play-pause-btn {
width: 60px;
height: 60px;
font-size: 20px;
background-color: #1db954;
}
.controls #play-pause-btn:hover {
background-color: #1ed760;
}
.progress-container {
margin-bottom: 20px;
}
input[type="range"] {
width: 100%;
height: 6px;
border-radius: 3px;
background: #444;
outline: none;
-webkit-appearance: none;
}
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 16px;
height: 16px;
border-radius: 50%;
background: #1db954;
cursor: pointer;
}
input[type="range"]::-moz-range-thumb {
width: 16px;
height: 16px;
border-radius: 50%;
background: #1db954;
cursor: pointer;
border: none;
}
.time-display {
display: flex;
justify-content: space-between;
font-size: 12px;
color: #aaa;
margin-top: 5px;
}
.volume-container {
display: flex;
align-items: center;
gap: 10px;
}
.playlist ul {
list-style-type: none;
padding: 0;
margin: 0;
}
.playlist li {
padding: 10px;
border-radius: 8px;
cursor: pointer;
transition: background-color 0.2s;
}
.playlist li:hover {
background-color: #333;
}
.playlist li.active {
background-color: #1db954;
font-weight: bold;
}
</style>
</head>
<body>
<div class="player-wrapper">
<div class="player-container">
<h2>音乐播放器</h2>
<div class="now-playing">
<h3 id="current-song-title">选择一首歌曲</h3>
<p id="current-artist">-</p>
</div>
<audio id="audio-player"></audio>
<div class="controls">
<button id="prev-btn">⏮</button>
<button id="play-pause-btn">▶</button>
<button id="next-btn">⏭</button>
</div>
<div class="progress-container">
<input type="range" id="progress-bar" value="0" min="0">
<div class="time-display">
<span id="current-time">0:00</span>
<span id="duration">0:00</span>
</div>
</div>
<div class="volume-container">
<label for="volume-bar">🔊</label>
<input type="range" id="volume-bar" value="50" min="0" max="100">
</div>
</div>
<div class="playlist-container">
<h2>播放列表</h2>
<div class="playlist" id="playlist">
<!-- 播放列表项将通过JavaScript动态生成 -->
</div>
</div>
</div>
<script>
// 1. 定义播放列表数据
const playlist = [
{ src: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3', title: 'SoundHelix Song 1', artist: 'SoundHelix' },
{ src: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3', title: 'SoundHelix Song 2', artist: 'SoundHelix' },
{ src: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-3.mp3', title: 'SoundHelix Song 3', artist: 'SoundHelix' }
// 你可以在这里添加你自己的MP3文件,注意需要提供可访问的URL
// { src: 'path/to/your/song1.mp3', title: '我的歌1', artist: '我' }
];
// 2. 获取DOM元素
const audioPlayer = document.getElementById('audio-player');
const playPauseBtn = document.getElementById('play-pause-btn');
const prevBtn = document.getElementById('prev-btn');
const nextBtn = document.getElementById('next-btn');
const progressBar = document.getElementById('progress-bar');
const volumeBar = document.getElementById('volume-bar');
const currentTimeSpan = document.getElementById('current-time');
const durationSpan = document.getElementById('duration');
const currentSongTitle = document.getElementById('current-song-title');
const currentArtist = document.getElementById('current-artist');
const playlistElement = document.getElementById('playlist');
let currentSongIndex = 0;
// 3. 初始化播放列表
function initPlaylist() {
playlistElement.innerHTML = '';
playlist.forEach((song, index) => {
const li = document.createElement('li');
li.textContent = `${song.title} - ${song.artist}`;
li.dataset.index = index;
if (index === currentSongIndex) {
li.classList.add('active');
}
li.addEventListener('click', () => loadSong(index));
playlistElement.appendChild(li);
});
}
// 4. 加载歌曲
function loadSong(index) {
currentSongIndex = index;
const song = playlist[currentSongIndex];
audioPlayer.src = song.src;
currentSongTitle.textContent = song.title;
currentArtist.textContent = song.artist;
// 更新播放列表高亮
document.querySelectorAll('.playlist li').forEach((li, i) => {
if (i === index) {
li.classList.add('active');
} else {
li.classList.remove('active');
}
});
// 如果之前是播放状态,则自动播放新歌曲
if (!audioPlayer.paused) {
audioPlayer.play();
}
}
// 5. 播放/暂停功能
playPauseBtn.addEventListener('click', () => {
if (audioPlayer.paused) {
audioPlayer.play();
playPauseBtn.textContent = '⏸';
} else {
audioPlayer.pause();
playPauseBtn.textContent = '▶';
}
});
// 6. 上一首/下一首
prevBtn.addEventListener('click', () => {
currentSongIndex = (currentSongIndex - 1 + playlist.length) % playlist.length;
loadSong(currentSongIndex);
});
nextBtn.addEventListener('click', () => {
currentSongIndex = (currentSongIndex + 1) % playlist.length;
loadSong(currentSongIndex);
});
// 7. 进度条和时间更新
audioPlayer.addEventListener('timeupdate', () => {
const progressPercent = (audioPlayer.currentTime / audioPlayer.duration) * 100;
progressBar.value = progressPercent;
const currentMinutes = Math.floor(audioPlayer.currentTime / 60);
const currentSeconds = Math.floor(audioPlayer.currentTime % 60).toString().padStart(2, '0');
currentTimeSpan.textContent = `${currentMinutes}:${currentSeconds}`;
});
audioPlayer.addEventListener('loadedmetadata', () => {
const durationMinutes = Math.floor(audioPlayer.duration / 60);
const durationSeconds = Math.floor(audioPlayer.duration % 60).toString().padStart(2, '0');
durationSpan.textContent = `${durationMinutes}:${durationSeconds}`;
});
progressBar.addEventListener('input', () => {
const goToTime = progressBar.value * audioPlayer.duration / 100;
audioPlayer.currentTime = goToTime;
});
volumeBar.addEventListener('input', () => {
audioPlayer.volume = volumeBar.value / 100;
});
audioPlayer.addEventListener('ended', () => {
// 歌曲结束后自动播放下一首
nextBtn.click();
});
// 8. 初始化
initPlaylist();
if (playlist.length > 0) {
loadSong(0);
}
</script>
</body>
</html>
代码解释
这个版本在功能增强版的基础上做了以下扩展:

(图片来源网络,侵删)
- 播放列表数据: 在JavaScript开头定义了一个
playlist数组,每个元素都是一个对象,包含歌曲的src(路径),title(标题), 和artist(艺术家)。 initPlaylist()函数: 这个函数负责将playlist数组动态渲染到HTML的<ul>列表中,每一项都绑定了点击事件,点击时会调用loadSong()函数。loadSong(index)函数:- 根据传入的
index从playlist中获取歌曲信息。 - 更新
<audio>标签的src。 - 更新界面上的歌曲标题和艺术家。
- 更新播放列表的“高亮”状态,显示当前正在播放的是哪一首歌。
- 如果播放器之前正在播放,新歌曲会自动开始播放。
- 根据传入的
- 上一首/下一首逻辑:
prevBtn和nextBtn的点击事件通过改变currentSongIndex并调用loadSong()来实现切换。- 使用取模运算符 () 来实现循环播放(即播放到最后一首后,下一首是第一首)。
- 自动播放下一首: 在
audioPlayer的ended事件中,我们模拟点击了“下一首”按钮,实现了歌曲播放完毕后自动切换的功能。
如何使用和自定义
- 替换音频文件: 将
playlist数组中的src值替换为你自己的MP3文件的URL,如果你把MP3文件和HTML文件放在同一个文件夹下,可以直接使用文件名,如src: 'my_music.mp3'。 - 修改样式: 所有的样式都在
<style>标签内,你可以自由修改颜色、字体、布局等,来打造符合你网站风格的播放器。 - 扩展功能: 这个框架已经具备了播放器的基本功能,你可以在此基础上继续扩展,
- 添加随机播放功能。
- 实现拖拽排序播放列表。
- 添加歌词显示功能。
- 连接后端API,从数据库动态获取播放列表。
希望这份详细的源代码和解释能帮助你创建出满意的网页MP3播放器!
