前端 用HTML,CSS, JS 写一个简易的音乐播放器

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Music Player</title>
    <style>
        /* 样式可自行修改 */
        .container {
            width: 600px;
            margin: 0 auto;
        }
        h2 {
            text-align: center;
        }
        .controls {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 20px;
        }
        .progress {
            width: 400px;
            height: 10px;
            background-color: #ccc;
        }
        .progress-bar {
            height: 10px;
            background-color: #6cb0ff;
        }
        .info {
            display: flex;
            justify-content: center;
            align-items: center;
            margin-bottom: 20px;
        }
        .song-info {
            margin-left: 20px;
            display: flex;
            flex-direction: column;
        }
        .song-info span {
            margin-bottom: 5px;
        }
        .song-list {
            list-style: none;
            padding: 0;
        }
        .song-list li {
            margin-bottom: 5px;
            cursor: pointer;
        }
        .song-list li.active {
            color: #6cb0ff;
        }
        .play-mode {
            display: flex;
            align-items: center;
        }
        .play-mode span {
            margin-right: 5px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2>Music Player</h2>
        <div class="controls">
            <button id="prev">上一首</button>
            <button id="play">播放</button>
            <button id="next">下一首</button>
            <div class="progress">
                <div class="progress-bar"></div>
            </div>
            <input type="range" id="volume" min="0" max="1" step="0.1" value="0.5">
        </div>
        <div class="info">
            <img src="" alt="" id="cover">
            <div class="song-info">
                <span id="song-name">歌曲名称</span>
                <span id="artist">歌手</span>
            </div>
        </div>
        <ul class="song-list">
            <li data-src="./music/song1.mp3">歌曲1</li>
            <li data-src="./music/song2.mp3">歌曲2</li>
            <li data-src="./music/song3.mp3">歌曲3</li>
        </ul>
        <div class="play-mode">
            <span>播放模式:</span>
            <button id="loop">循环</button>
            <button id="random">随机</button>
            <button id="single">单曲</button>
        </div>
    </div>
    <script>
        const audio = new Audio(); // 创建音乐播放器对象
        const songList = document.querySelectorAll('.song-list li');
        const prevBtn = document.querySelector('#prev');
        const playBtn = document.querySelector('#play');
        const nextBtn = document.querySelector('#next');
        const volumeSlider = document.querySelector('#volume');
        const progressBar = document.querySelector('.progress-bar');
        const coverImg = document.querySelector('#cover');
        const songName = document.querySelector('#song-name');
        const artistName = document.querySelector('#artist');
        const loopBtn = document.querySelector('#loop');
        const randomBtn = document.querySelector('#random');
        const singleBtn = document.querySelector('#single');
        let currentIndex = 0;
        let isPlaying = false;
        let playMode = 'loop'; // 默认播放模式为循环

        function playSong(index) {
            const song = songList[index];
            audio.src = song.dataset.src;
            audio.play();
            isPlaying = true;
            playBtn.textContent = '暂停';
            coverImg.src = `./images/cover${index+1}.jpg`;
            songName.textContent = song.textContent;
            artistName.textContent = '歌手名称';
            songList.forEach((item) => {
                item.classList.remove('active');
            });
            song.classList.add('active');
        }

        function getNextIndex() {
            let nextIndex;
            switch(playMode) {
                case 'loop':
                    nextIndex = currentIndex + 1;
                    if (nextIndex >= songList.length) {
                        nextIndex = 0;
                    }
                    break;
                case 'random':
                    nextIndex = Math.floor(Math.random() * songList.length);
                    break;
                case 'single':
                    nextIndex = currentIndex;
                    break;
            }
            return nextIndex;
        }

        function updateProgress() {
            const progress = audio.currentTime / audio.duration * 100;
            progressBar.style.width = `${progress}%`;
        }

        function init() {
            playSong(currentIndex);
        }

        init();

        prevBtn.addEventListener('click', () => {
            currentIndex--;
            if (currentIndex < 0) {
                currentIndex = songList.length - 1;
            }
            playSong(currentIndex);
        });

        nextBtn.addEventListener('click', () => {
            currentIndex = getNextIndex();
            playSong(currentIndex);
        });

        playBtn.addEventListener('click', () => {
            if (isPlaying) {
                audio.pause();
                isPlaying = false;
                playBtn.textContent = '播放';
            } else {
                audio.play();
                isPlaying = true;
                playBtn.textContent = '暂停';
            }
        });

        volumeSlider.addEventListener('input', () => {
            audio.volume = volumeSlider.value;
        });

        audio.addEventListener('timeupdate', updateProgress);

        progressBar.addEventListener('click', (e) => {
            const width = progressBar.clientWidth;
            const clickX = e.offsetX;
            const duration = audio.duration;
            audio.currentTime = clickX / width * duration;
        });

        songList.forEach((song, index) => {
            song.addEventListener('click', () => {
                currentIndex = index;
                playSong(currentIndex);
            });
        });

        loopBtn.addEventListener('click', () => {
            playMode = 'loop';
        });

        randomBtn.addEventListener('click', () => {
            playMode = 'random';
        });

        singleBtn.addEventListener('click', () => {
            playMode = 'single';
        });

        audio.addEventListener('ended', () => {
            currentIndex = getNextIndex();
            playSong(currentIndex);
        });
    </script>
</body>
</html>
 

这个实现了基本的播放/暂停、歌曲切换、音量控制、进度条控制和显示歌曲信息等功能,同时还支持播放模式切换和歌曲列表操作。不过这只是一个简单的示例,实际上还有很多功能需要进一步完善和优化,例如:

  1. 支持歌词显示和同步
  2. 支持播放列表编辑和保存
  3. 支持拖拽上传歌曲
  4. 支持在线搜索歌曲
  5. 支持分享和评论等社交功能

这些功能的实现需要涉及到不同的技术和工具,如 AJAX、WebSocket、React、Node.js 等。如果你想要深入学习和掌握 Web 开发技术,可以选择相应的学习路径和教程进行学习。

相关推荐
m0_719084111 小时前
React笔记张天禹
前端·笔记·react.js
Ziky学习记录1 小时前
从零到实战:React Router 学习与总结
前端·学习·react.js
wuhen_n1 小时前
JavaScript链表与双向链表实现:理解数组与链表的差异
前端·javascript
wuhen_n1 小时前
JavaScript数据结构深度解析:栈、队列与树的实现与应用
前端·javascript
我是一只puppy1 小时前
使用AI进行代码审查
javascript·人工智能·git·安全·源代码管理
颜酱1 小时前
从二叉树到衍生结构:5种高频树结构原理+解析
javascript·后端·算法
狗哥哥2 小时前
微前端路由设计方案 & 子应用管理保活
前端·架构
前端大卫2 小时前
Vue3 + Element-Plus 自定义虚拟表格滚动实现方案【附源码】
前端
却尘2 小时前
Next.js 请求最佳实践 - vercel 2026一月发布指南
前端·react.js·next.js
ccnocare2 小时前
浅浅看一下设计模式
前端