前端 用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 开发技术,可以选择相应的学习路径和教程进行学习。

相关推荐
anOnion16 小时前
构建无障碍组件之Switch Pattern
前端·html·交互设计
华洛17 小时前
多写点skill吧,写的越多这行业死的越快。
前端·javascript·产品
剪刀石头布啊17 小时前
从函数式编程介绍
前端
vjmap17 小时前
全新唯杰WebCAD编辑平台发布:全面拥抱AI,WebCAD智能体(Agent)来了
前端·gis·ai编程
剪刀石头布啊18 小时前
扫码登录方式
前端
剪刀石头布啊18 小时前
浏览器指纹
前端
剪刀石头布啊18 小时前
前端截图html2canvas
前端
IT_陈寒20 小时前
别再死记硬背Python语法了!这5个思维模式让你代码量减半
前端·人工智能·后端
beata21 小时前
Java基础-19:Java 死锁深度解析:从原理、检测到预防与实战指南
java·前端
Sunshine11121 小时前
浏览器渲染zz
前端