【前端】-音乐播放器(源代码和结构讲解,大家可以将自己喜欢的歌曲添加到数据当中,js实现页面动态显示音乐)

前言:音乐播放器是前端开发中的一个经典项目,通过它可以掌握很多核心技术,如音频处理、DOM操作、事件监听、动画效果等。这个项目不仅能提升前端开发的技能,还能让开发者深入理解JavaScript与HTML的协同作用。

页面展示:

歌曲页面+列表(html代码):

音乐

 

 下面有详细的注释讲解,大家可以对照着上图中的结构进行理解,当然也可以自己写,大家了解我的思路就行

  <div class="wrapper"><div class="player-warp"><!-- 歌曲信息卡片(隐藏页面) --><div class="player-info"><div class="info"><div class="name"><h4>我记得</h4></div><div class="singer-album">赵雷-署前街少年</div><div class="music-progress"><!-- 时间显示 --><div class="music-progress-top"><!-- 当前时间 --><span class="current-time">00:00</span><!-- 歌曲总时间 --><span class="time">05:29</span></div><!-- 音乐进度线 --><div class="music-progress-bar"><!-- 绘制播放线 --><div class="music-progress-line"></div></div></div></div></div><!-- 歌曲控制页面 --><div class="player-control"><div class="cover"><img src="" alt=""></div><!-- 控制按钮 --><div class="control"><i id="prevBtn" class="iconfont">&#xe844;</i><i id="playBtn" class="iconfont paused">&#xe848;</i><i id="nextBtn" class="iconfont">&#xe845;</i><i id="openModal" class="iconfont">&#xe8bf;</i></div></div></div></div><!-- 设置音乐背景页面 --><div class="bg"></div><!-- 绘制歌曲列表 --><div class="modal"><div class="modal-box"><!-- 设置模块头部内容 --><div class="modal-box-top"><div class="modal-title"><h3>音乐列表</h3></div><div class="modal-close"><!-- 放置让模块消失的图标 --><i class="iconfont">&#xe8b9;</i></div></div><div class="modal-wrapper"><!-- 容器 --><ul class="song-list"></ul></div></div></div><!-- 音乐--><audio src=""></audio><script src="./js/jquery.js"></script>

 页面功能介绍:

1.点击播放按钮,音乐开始播放,歌曲信息将自然弹出,页面中的圆形图片开始旋转

2.点击前进和后退按钮,音乐和页面信息将进行相应改变

3.点击模块列表内容,可播放该音乐

js功能实现:

 家人们我是通过jQuery实现的

 1.使用ajax请求音乐数据

通过ajax请求数据,并且调用更新页面数据的函数,在页面中显示第一个歌曲, 添加音乐列表

    let musicList = [];let currentIndex = 0;  // 当前播放音乐的下标// Ajax 获取音乐数据$.ajax({type: "GET",url: "./music.json",success: function (data) {musicList = data;render(musicList[currentIndex]);  // 渲染当前音乐renderMusicList(musicList);       // 渲染音乐列表}});
 2.页面渲染信息函数:

 获得jQuery包装级对象包装级对象,并且通过text()方法,在对象中添加数据

    // 渲染音乐详情function render(data) {$(".name h4").text(data.name);$(".time").text(data.time);$(".singer-album").text(`${data.singer} - ${data.album}`);$(".cover img").attr("src", data.cover);$("audio").attr("src", data.audio_url);$('.bg').css({background: `url("${data.cover}") no-repeat center center`,"background-size": "cover"});}
3.播放和暂停音乐:

 设置点击播放按钮,将暂停按钮变成播放按钮,并且显示歌曲信息,大家可以通过上面视频了解

// 绑定播放按钮事件$("#playBtn").on("click", togglePlay);    // 播放与暂停音乐function togglePlay() {//返回dom对象let audio = $("audio").get(0);if (audio.paused) {$("#playBtn").removeClass("paused").addClass("running").html('&#xe847;');$(".player-info").animate({ top: '-95%' }, 'slow');$(".cover").css({ "animation-play-state": "running" });audio.play();} else {$("#playBtn").removeClass("running").addClass("paused").html('&#xe848;');$(".player-info").animate({ top: '0%' }, 'slow');$(".cover").css({ "animation-play-state": "paused" });audio.pause();}}
4.渲染音乐列表:

通过js动态添加歌曲列表 

    // 渲染音乐列表function renderMusicList(list) {$(".song-list").empty();$.each(list, function (index, item) {let isPlaying = (index == currentIndex && !$("audio").get(0).paused);let $li = $(`<li id="${index}" class="${index == currentIndex ? 'playing' : ''}"><span>${index + 1}.${item.name} - ${item.singer}</span> <span class="iconfont">${isPlaying ? '&#xe784;' : '&#xe781;'}</span></li>`);$(".song-list").append($li);});}
5.更新播放函数:

这个方法会被重复利用,所以封装起来 ,更新当前音乐信息,更新列表

    // 更新并播放音乐function updateAndPlay() {render(musicList[currentIndex]);$("#playBtn").trigger("click");  renderMusicList(musicList);    }
6.上下按钮点击事件:

点击前进和后退按钮更换歌曲事件,通过currentIndex变化更换当前歌词(因为当前歌词是通过currentIndex下标进行控制的) 

    // 绑定上一首、下一首按钮事件$("#prevBtn").on("click", playPrev);// 播放上一首音乐function playPrev() {currentIndex = (currentIndex > 0) ? currentIndex - 1 : musicList.length - 1;updateAndPlay();}$("#nextBtn").on("click", playNext);// 播放下一首音乐function playNext() {currentIndex = (currentIndex < musicList.length - 1) ? currentIndex + 1 : 0;updateAndPlay();}
7.更新音乐条的进度:

根据当前音乐的时间,获得值的百分比赋值给进度表的宽度 

    // 格式化时间function formatTime(time) {let min = Math.floor(time / 60);let sec = Math.floor(time % 60);return `${min < 10 ? '0' : ''}${min}:${sec < 10 ? '0' : ''}${sec}`;}// 更新播放时间和进度条$("audio").on("timeupdate", function () {let audio = $("audio").get(0);let currentTime = audio.currentTime || 0;let duration = audio.duration || 0;$(".current-time").text(formatTime(currentTime));$(".time").text(formatTime(duration));let value = (currentTime / duration) * 100;$(".music-progress-line").css({ width: value + "%" });});
8.显示模块列表:

点击两个小图标点开音乐列表和关闭音乐列表 

    // 打开和关闭音乐列表弹窗$("#openModal").on("click", function () {$(".modal").css({ display: "block" });renderMusicList(musicList);  // 渲染音乐列表});$(".modal-close").on("click", function () {$(".modal").css({ display: "none" });});
9.点击音乐列表播放音乐事件:

 点击列表相应歌曲播放点击歌曲

 // 点击音乐列表播放对应歌曲$(".song-list").on("click", "li", function () {currentIndex = parseInt($(this).attr("id"));updateAndPlay();  // 播放选择的音乐});
10.音乐结束事件:

这个我设置的是 playNext ()  播放下一个歌曲,大家还可以自己进行其他操作

    // 监听音乐播放完毕的事件,自动播放下一首$("audio").on("ended", function () {playNext();});

源代码:

上面HTML代码和JavaScript代码都是完整的,大家可以直接取上面的

CSS:
* {margin: 0;padding: 0;
}body {user-select: none;background-color: #dadada;
}/* 动画 */
@keyframes circle {0% {transform: rotate(0deg);}100% {transform: rotate(360deg);}
}.wrapper {width: 360px;height: 80px;margin: auto;margin-top: 200px;
}.player-warp {position: relative;
}.player-info {width: 90%;height: 100%;position: absolute;/* top: -95%; */top: 0;left: 5%;z-index: -1;background-color: rgba(255, 255, 255, 0.15);box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);backdrop-filter: blur(3.5px);border-radius: 10px;border: 1px solid rgba(255, 255, 255, 0.17);display: flex;justify-content: flex-end;
}.player-info .info {padding: 5px;width: 60%;font-size: 15px;
}/* 进度条%比 */
.info .music-progress {width: 100%;
}.music-progress .music-progress-top {display: flex;color: #ff668c;justify-content: space-between;
}/* 绘制歌曲进程背景 */
.music-progress .music-progress-bar {width: 100%;height: 3px;background-color: #b8b8b8;border-radius: 10px;margin-top: 3px;
}/* 绘制覆盖线 */
.music-progress .music-progress-line {width: 0%;height: 90%;background-color: #ff5a94;
}.player-warp .player-control {width: 360px;height: 80px;background-color: #ffffff;border-radius: 15px;display: flex;z-index: 10;
}.player-control .cover {position: relative;/* margin-left: 20px; */left: 30px;width: 104px;height: 100px;border-radius: 50px;background-color: #ffffff;margin-top: -60px;animation: circle 5s infinite linear;animation-play-state: paused;
}.player-control img {position: absolute;top: 5%;left: 5%;width: 90%;height: 90px;border-radius: 50%;
}.player-control .cover::before {content: "";display: inline-block;width: 15px;height: 15px;border-radius: 50%;position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);background-color: #fff;
}.player-control .control {margin-left: 20px;width: 70%;display: flex;align-items: center;justify-content: space-around;
}.player-control .control i {display: block;color: #b05757;font-size: 45px;margin-right: 6px;cursor: pointer;transition: all 0.4s;
}.control i:hover {color: #e2a3a3 !important;
}.bg {position: absolute;top: 0;left: 0;z-index: -2;width: 100%;height: 100%;background: url("http://p2.music.126.net/34YW1QtKxJ_3YnX9ZzKhzw==/2946691234868155.jpg") no-repeat center center;transform: scale(2);/* 模糊 */filter: blur(50px);transition: all 1s;
}li {list-style: none;
}.modal {width: 100%;height: 100%;background-color: rgba(128, 128, 128, 0.25);/* 设置固定定位 */position: fixed;top: 0;right: 0;display: none;
}.modal .modal-box {width: 30%;height: 100%;background-color: #fff;position: absolute;top: 0;right: 0;padding: 5px;
}.modal-box .modal-close .iconfont {font-size: 23px;
}.modal-box .modal-box-top {width: 100%;height: 40px;display: flex;align-items: center;justify-content: space-between;margin-bottom: 5px;
}.modal-box .modal-wrapper li {cursor: pointer;display: block;height: 30px;line-height: 30px;display: flex;justify-content: space-between;margin-bottom: 4px;background-color: rgba(230, 230, 230, 0.37);border-bottom: 1px solid rgb(83, 83, 83);
}.modal-box .modal-wrapper li span {display: block;font-size: 18px;
}.modal-box .modal-wrapper li .iconfont {font-size: 28px;
}.modal-box .modal-wrapper li .iconfont:hover {font-size: 30px;
}.playing span {color: #00ddc3;
}
music.json:

[

  {

    "name": "勇敢爱",

    "audio_url": "./audios/Mi2 - 勇敢爱 [mqms2].mp3",

    "singer": "Mi2",

    "album": "吴少华",

    "cover": "./img/7.png",

    "time": "04:16"

  },

  {

    "name": "一人饮酒醉(柔情版)",

    "audio_url": "./audios/程嘉敏 - 一人饮酒醉 (柔情版) [mqms].mp3",

    "singer": "程嘉敏",

    "album": "吴少华",

    "cover": "./img/1.png",

    "time": "01:20"

  },

  {

    "name": "明月天涯",

    "audio_url": "./audios/等什么君 - 明月天涯 [mqms2].mp3",

    "singer": "等什么君",

    "album": "吴少华",

    "cover": "./img/2.png",

    "time": "04:14"

  },

  {

    "name": "生僻字",

    "audio_url": "./audios/陈柯宇 - 生僻字.mp3",

    "singer": "陈柯宇",

    "album": "吴少华",

    "cover": "./img/3.png",

    "time": "03:36"

  },

  {

    "name": "依存症",

    "audio_url": "./audios/东京塔子 - 依存症 [mqms2].mp3",

    "singer": "东京塔子",

    "album": "吴少华",

    "cover": "./img/4.png",

    "time": "04:39"

  },

  {

    "name": "恶魔的爱",

    "audio_url": "./audios/李宏毅&李明霖 - 恶魔的爱 [mqms2].mp3",

    "singer": "李宏毅&李明霖",

    "album": "吴少华",

    "cover": "./img/5.png",

    "time": "04:12"

  },

  {

    "name": "梦回还",

    "audio_url": "./audios/呦猫UNEKO - 梦回还 [mqms2].mp3",

    "singer": "呦猫UNEKO",

    "album": "吴少华",

    "cover": "./img/6.png",

    "time": "04:10"

  },

  {

    "name": "当归",

    "audio_url": "./audios/宿雨涵 - 当归.ogg",

    "singer": "宿雨涵",

    "album": "吴少华",

    "cover": "./img/8.png",

    "time": "03:54"

  },

  {

    "name": "时光笔墨",

    "audio_url": "./audios/张碧晨 - 时光笔墨.ogg",

    "singer": "张碧晨",

    "album": "吴少华",

    "cover": "./img/9.png",

    "time": "05:01"

  },

  {

    "name": "勾指起誓",

    "audio_url": "./audios/泠鸢yousa - 勾指起誓.ogg",

    "singer": "泠鸢yousa",

    "album": "吴少华",

    "cover": "./img/10.png",

    "time": "03:03"

  },

  {

    "name": "散仙如烟",

    "audio_url": "./audios/醋醋 - 散仙如烟.ogg",

    "singer": "醋醋",

    "album": "吴少华",

    "cover": "./img/11.png",

    "time": "03:43"

  },

  {

    "name": "爱情女神",

    "audio_url": "./audios/郭美美 - 爱情女神.ogg",

    "singer": "郭美美",

    "album": "吴少华",

    "cover": "./img/12.png",

    "time": "03:36"

  }

]

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/440168.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web安全 - 文件上传漏洞(File Upload Vulnerability)

文章目录 OWASP 2023 TOP 10导图定义攻击场景1. 上传恶意脚本2. 目录遍历3. 覆盖现有文件4. 文件上传结合社会工程攻击 防御措施1. 文件类型验证2. 文件名限制3. 文件存储位置4. 文件权限设置5. 文件内容检测6. 访问控制7. 服务器配置 文件类型验证实现Hutool的FileTypeUtil使用…

Python中的机器学习:从入门到实战

机器学习是人工智能领域的一个重要分支&#xff0c;它通过构建模型来使计算机从数据中学习并做出预测或决策。Python凭借其丰富的库和强大的生态系统&#xff0c;成为了机器学习的首选语言。本文将从基础到实战&#xff0c;详细介绍如何使用Python进行机器学习&#xff0c;涵盖…

【汇编语言】寄存器(CPU工作原理)(二)—— 汇编指令的基础操作

文章目录 前言正文——&#xff08;一气呵成解决本文内容&#xff09;结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言可以深入理解计算机底…

Android Framework AMS(02)AMS启动及相关初始化5-8

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容过多&#xff0c;因此拆成2个章节&#xff0c;本章节是第二章节&…

LabVIEW提高开发效率技巧----使用动态事件

在LabVIEW开发过程中&#xff0c;用户交互行为可能是多样且不可预知的。为应对这些变化&#xff0c;使用动态事件是一种有效的策略。本文将从多个角度详细介绍动态事件的概念及其在LabVIEW开发中的应用技巧&#xff0c;并结合实际案例&#xff0c;说明如何通过动态事件提高程序…

Vector不清晰点学习易错点

什么是迭代器 是一个广义指针它可以是指针&#xff0c;也可以是一个可对其执行类似指针得操作-如解除引用&#xff08;如operator*()&#xff09;和递增&#xff08;operator()&#xff09;STL中每个容器类都定义了一个合适的迭代器&#xff0c;该迭代器的类型是一个名为itera…

【Python游戏开发】贪吃蛇游戏demo拓展

拓展上一项目【Python游戏开发】贪吃蛇 实现穿墙效果 # 检测游戏是否结束 def check_gameover():global finished# 移除蛇头位置超过窗口判断for n in range(len(body) - 1):if(body[n].x snake_head.x and body[n].y snake_head.y):finished True # 状态检测 def ch…

html5 + css3(下)

目录 CSS基础基础认识体验cssCSS引入方式 基础选择器选择器-标签选择器-类选择器-id选择器-通配符 字体和文本样式1.1 字体大小1.2 字体粗细1.3 字体样式&#xff08;是否倾斜&#xff09;1.4 常见字体系列&#xff08;了解&#xff09;1.5 字体系列拓展-层叠性font复合属性文本…

oh-crop: OpenHarmony/HarmonyOS上的简单的图片剪裁库,可用于头像剪裁等常见场景。

&#x1f4da; 简介 oh-crop: OpenHarmony/HarmonyOS上的简单的图片剪裁库&#xff0c;可用于头像剪裁等常见场景。 代码仓库&#xff1a;oh-crop &#x1f4da; 下载安装 ohpm i xinyansoft/oh-cropOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考: 下载安装三方库…

一个值得关注的3D生成新算法:速度和图像生成平齐,能生成合理的展开贴图和高质量mesh

今天跟大家介绍的GIMDiffusion是一种新的Text-to-3D模型&#xff0c;利用几何图像&#xff08;Geometry Images&#xff09;来高效地表示3D形状&#xff0c;避免了复杂的3D架构。通过结合现有的Text-to-Image模型如Stable Diffusion的2D先验知识&#xff0c;GIMDiffusion能够在…

【数据结构】【链表代码】相交链表

/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {//先求出两个链表的长度ListNode…

Unity 编辑器多开

开发多人联机的功能时大多数会遇到测试机不方便的问题。想多开同一个项目Uinty又禁止。。。因为在使用Unity Editor打开一个项目时&#xff0c;Unity Editor会在项目目录建立一个Temp目录&#xff0c;同时对里面的一个UnityLockfile文件进行加锁。SO...可以使用以下方法进行多开…

【easypoi 一对多导入解决方案】

easypoi 一对多导入解决方案 1.需求2.复现问题2.1校验时获取不到一对多中多的完整数据2.2控制台报错 Cannot add merged region B5:B7 to sheet because it overlaps with an existing merged region (B3:B5). 3.如何解决第二个问题处理&#xff1a; Cannot add merged region …

ISO IEC 18004 2015 PDF 文字版下载

ISO_IEC_18004_2015_en-US - 道客巴巴 (doc88.com)https://www.doc88.com/p-67816330893254.html

Kafka和RabbitMQ区别

RabbitMQ的消息延迟是微秒级&#xff0c;Kafka是毫秒级&#xff08;1毫秒1000微秒&#xff09; 延迟消息是指生产者发送消息发送消息后&#xff0c;不能立刻被消费者消费&#xff0c;需要等待指定的时间后才可以被消费。 Kafka的单机呑吐量是十万级&#xff0c;RabbitMQ是万级…

vSAN02:容错、存储策略、文件服务、快照与备份、iSCSI

目录 vSAN容错条带化存储策略1. 创建新策略2. 应用存储策略 vSAN文件服务文件服务快照与备份 vSAN iSCSI目标服务 vSAN容错 FTT&#xff1a;Fault to Tolerance 允许故障数 故障域&#xff1a;每一台vSAN主机是一个故障域 - 假设3台超融合&#xff08;3计算1存储&#xff09;&…

【Kubernetes】常见面试题汇总(五十四)

目录 120.创建 init C 容器后&#xff0c;其状态不正常&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于【Kubernetes】的生产…

【Spring Boot 入门一】构建你的第一个Spring Boot应用

一、引言 在当今的软件开发领域&#xff0c;Java一直占据着重要的地位。而Spring Boot作为Spring框架的延伸&#xff0c;为Java开发者提供了一种更加便捷、高效的开发方式。它简化了Spring应用的搭建和配置过程&#xff0c;让开发者能够专注于业务逻辑的实现。无论是构建小型的…

Windows搭建RTMP服务器

这里写自定义目录标题 1 Nginx-RTMP服务器搭建1.1 下载Nginx1.2 下载Nginx的RTMP扩展包1.3 配置Nginx1.4 启动Nginx1.5 查看Nginx状态 2 FFmpeg推流2.1 下载FFmpeg2.2 配置FFmpeg环境变量2.3 验证FFmpeg配置 3 视频推流3.1 OBS推流3.2 FFmpeg推流 4 VLC拉流4.1 VLC4.2 打开网络…

4款专业电脑数据恢复软件,帮你保障数据安全。

电脑里面会出现的数据丢失场景有很多&#xff0c;像硬盘故障、回收站清空、电脑格式化、系统崩溃、病毒入侵等等&#xff1b;如果发现数据丢失后&#xff0c;建议应停止使用电脑&#xff0c;避免新的数据写入覆盖丢失的数据。然后再尝试进行数据找回&#xff0c;如果想自己进行…