运用js教你轻松制作html音乐播放器


Posted in Javascript onApril 17, 2020

用HTML做了个音乐播放器,可以循环播放,选择歌曲,以及自动播放下一首,运用了js和json知识,下面是效果图和源码,有兴趣的可以试试哦

效果图:

运用js教你轻松制作html音乐播放器

源码:html

<span style="color:#999999;"><!DOCTYPE html> 
<html> 
 
 <head> 
 <meta charset="utf-8" /> 
 <title>音乐播放器</title> 
 <script type="text/javascript" src="js/jquery-2.1.1.min.js" ></script> 
 <script src="js/music.js" type="text/javascript" charset="utf-8"></script> 
 <style> 
 * { 
 margin: 0 auto; 
 padding: 0; 
 } 
 
 .page { 
 position: absolute; 
 width: 100%; 
 height: 100%; 
 } 
 
 .header { 
 width: 100%; 
 height: 44px; 
 background: lightcoral; 
 position: relative; 
 } 
 
 .title { 
 font-size: 20px; 
 color: white; 
 float: left; 
 margin: 7px 10px; 
 } 
 
 .search { 
 float: right; 
 width: 30px; 
 margin: 7px 10px; 
 } 
 
 .earch { 
 float: right; 
 width: 30px; 
 margin: 7px 10px; 
 } 
 .musicBox{ 
 width: 100%; 
 position: absolute; 
 top: 44px; 
 bottom: 50px; 
 background:url(音乐播放器资源/img/bg.jpg); 
 background-size:100% 100%; 
 /*内容超出范围部分滚动*/ 
 overflow: scroll; 
  
 } 
 /*定义一条音乐的列表,每行的样式 在js中动态加载到音乐列表每一行的div上*/ 
 .music{ 
 width: 100%; 
 height: 60px; 
 border-bottom: 2px solid gray; 
 margin: 10px 20px; 
  position: relative; 
 } 
 .music img{ 
 width: 40px; 
 height: 40px; 
 margin: 10px 20px; 
 
 } 
 .music p{ 
 color: goldenrod; 
 position: absolute; 
 left: 85px; 
 top: 10px; 
  
 } 
 /*音乐播放时所对应的行的样式*/ 
 .musicPlay{ 
 background: rgba(120,10,60,0.4); 
  
 } 
 .musicPlay p{ 
 color: red; 
 } 
 /*设置footer 的样式*/ 
 .footer{ 
 width: 100%; 
 height: 50px; 
 position: absolute; 
 bottom: 0px; 
 background: lightcoral; 
 } 
 .range{ 
 width: 100%; 
 position: absolute; 
 top: -3px; 
 left: 0px; 
  
 } 
 .pic{ 
 width: 30px; 
 height: 30px; 
 position: absolute; 
 left: 10px; 
 top: 12px; 
 border-radius: 15px; 
 animation: picAn 2s infinite linear; 
  
 } 
 @keyframes picAn{ 
 from{} 
 to{transform: rotate(360deg);} 
 } 
 /*控制按钮的样式*/ 
 .play{ 
 width: 20px; 
 height: 20px; 
 position: absolute; 
 left: 45%; 
 top: 10px; 
 } 
 .pre{ 
 width: 30px; 
 height: 30px; 
 position: absolute; 
 left: 0px; 
 top: 5px; 
  
 
 } 
 .next{ 
 width: 30px; 
 height: 30px; 
 position: absolute; 
 right: 0px; 
 top: 5px; 
 } 
 .love{ 
 position: absolute; 
 right: 5px; 
 top: 15px; 
 width: 20px; 
 height: 30px; 
  
 } 
 .musicControls{ 
 position: absolute; 
 width: 50%; 
 left: 25%; 
 top: 10px; 
 } 
 </style> 
 </head> 
 
 <body> 
 <div class="page"> 
 <audio id="audio"></audio> 
 <div class="header"> 
 <h3 class="title">我的音乐</h3> 
 <img class="search" src="音乐播放器资源/img/search.png" /> 
 <img class="earch" src="音乐播放器资源/img/earch.png" /> 
 </div> 
 <!--显示音乐类表--> 
 <div class="musicBox"> 
 <!--内容要通过读取json文件来获得 音乐列表--> 
 
 </div> 
 <!--控制台--> 
 <div class="footer"> 
 <!--进度条--> 
 <input type="range" class=" range" /> 
 <img src="音乐播放器资源/img/deng.jpg" class="pic" /> 
 <!--控制按钮--> 
 <div class="musicControls"> 
  <img src="音乐播放器资源/img/pre.png" class="pre" /> 
  <img src="音乐播放器资源/img/play.png" class="play" /> 
  <img src="音乐播放器资源/img/next.png" class="next" /> 
 </div> 
 <img src="音乐播放器资源/img/shoucang.png" class="love" /> 
 </div> 
 </div> 
 
 </body> 
 
</html></span>

下面是js代码:

$(document).ready(function(){ 
 //音乐播放器需要,播放器对象player,音乐对象,用play去播放music对象 
// 创建music对象,用于保存音乐的属性 
 function Music(){ 
 
 } 
 Music.prototype.src= ""; 
 Music.prototype.img =""; 
 Music.prototype.num=""; 
 Music.prototype.musicName=""; 
 Music.prototype.name=""; 
 //创建player对象 
 function Player(){ 
 
 } 
 Player.prototype.audio = document.getElementById("audio"); 
// 目前播放第几首歌 
 Player.prototype.playIndex=0; 
 Player.prototype.isplay = false; 
// 定义播放器的方法 
 Player.prototype.rangUpdate = function(){ 
 //this.audio.ontimeupdate =function() 音乐播放器播放音乐时监听 
 //把进度条和音乐的时间长度结合起来 
 //音乐每播放一秒进读条就会前进一个单位 this.duration音乐的总长度 
 this.audio.ontimeupdate =function(){ 
  //把进度条的总长度设为音乐的总长度 
 $(".range").attr("max",this.duration); 
  
 //设置进度条的值为播放的时间 
 $(".range").val(this.currentTime); 
 //当一首歌播放完再去播放下一首 
 if (this .currentTime == this.duration ) { 
 player.nextMusic(); 
 } 

  
 } 
 
 }; 
 Player.prototype.playMusic =function(){ 
 //向播放器添加音乐路径 
 $(this.audio).attr("src",musicModels[this .playIndex].src); 
 this .audio.play(); 
 //换音乐图片 
 $(".pic").attr("src",musicModels[this.playIndex].img); 
 //波让其的状态 
 this .isplay= true; 
 
 }; 
 Player.prototype.nextMusic = function(){ 
 
 
 //越界问题 
 if (this .playIndex >= musicModels.length - 1) { 
 this.playIndex = 0; 
  
 }else{ 
 this.playIndex = this .playIndex + 1; 
 } 
 //改变音乐类表的对应项的样式 
 
 this.playMusic(); 
 $(".music").eq(this.playIndex).addClass("musicPlay") 
 .siblings() 
 .removeClass("musicPlay"); 
 
 }; 
 Player.prototype.preMusic =function(){ 
 if (this .playIndex <= 0) { 
 this.playIndex = musicModels.length-1; 
  
 }else{ 
 this.playIndex = this .playIndex - 1; 
 } 
 //改变音乐类表的对应项的样式 
 
 this.playMusic(); 
 $(".music").eq(this.playIndex).addClass("musicPlay") 
 .siblings() 
 .removeClass("musicPlay"); 
 }; 
 Player.prototype.playOrPause = function(){ 
 if(this.isplay){ 
 this.audio.pause(); 
 $(".play").attr("src","音乐播放器资源/img/stop.png"); 
 }else{ 
 this.audio.play(); 
 $(".play").attr("src","音乐播放器资源/img/play.png"); 
 } 
 this.isplay = !this.isplay; 
 }; 
// js文件从此向下 
// 创建音乐数组 
 var musicModels = []; 
 //创建音乐播放器对象 
 var player= new Player(); 
 /*Ajax 目的是在js中实现异步操作 
 * JS是单线程 的,在单线程中模拟java oc 多线程 开辟异步任务,,浏览器的引擎去做一步操作, 
 * 实质上不是开辟一个子线程,而是创建一个异步任务 
 * 优点: 
 * 1.不需要用户等待服务器相应 
 * 在异步派发xmlHTTPRequest 请求后,马上把控制权收回就被返回浏览器空页面 
 * 界面不会出现白板,等待后台服务器得到请求后,再去执行完成方法,在方法中填写界面数据的代码 
 * 2.不需要加载整个页面只需要更新局部数据,节省流量,减轻服务器压力 
 * 
 * 为xmlHTTPRequest 设置一个回调函数,服务器数据到达时触发函数,发送请求时可以带少量的参数 
 * 实现按需去数据 
 * 
 $.ajax(),这是jQuery 对ajax的封装的最基础的函数,通过这个函数可以实现异步通讯功能 
 var configObj= { 
// method:数据提交方式 get OR post 
 URL:请求的网址 
 async:是否异步,默认true 
 data:post请求的参数 
 dataType :服务器返回的类型,xml string json 
 success:请求成功后的回调方法 
 error :请求失败后的方法 
 
 } 
 $.ajax(configObj);完成异步请求 
 二、$post()只能采取post请求 
 三、$get() 
 四、$getJSON( url ,完成回调);可以请求本地路径的内容 
 * 
 * 
 * */ 
 $.getJSON("pbl.json",function(data){ 
// console.log(data); 
 for (var i=0;i<data.length;i++) { 
 var music = new Music(); 
 music.src= "音乐播放器资源/" + data[i].src; 
 music.img= "音乐播放器资源/" + data[i].img; 
 music.musicName = data[i].musicName; 
 music.name = data[i].name; 
 music.num = data[i].num; 
 musicModels.push(music); 
  
 } 
 //播放音乐 
 isertData(); 
 player.playMusic(); 
 player.rangUpdate(); 
 $(".music").eq(player.playIndex).addClass("musicPlay") 
 .siblings() 
 .removeClass("musicPlay"); 
 }); 
 function isertData(){ 
 //先要遍历数据源数组 
 /* 
 html5 中添加了一个data-*的方式 来自定义属性 
 用data-前缀,添加到自定义属性名上, 
 这样的结构可以存储少量的数据 
 * */ 
 for (var i=0;i<musicModels.length;i++) { 
// /创建一个DIV元素表示,音乐中的一行,给这个div添加music样式 
//和绑定自定义属性index来记录这个div是列表中的第几行 
 var $musicDiv = $("<div class = 'music' data-index = "+ i +"></div>"); 
// 将这个div添加到musicBox 中 
 $(".musicBox").append($musicDiv); 
// 设计musicdiv中的子元素,子元素有两个,一个是歌曲的图片,歌曲的信息 
// 创建一个img 显示歌曲图片 
 var $img = ( 
 "<img src =" + musicModels[i].img+" />"); 
 $musicDiv.append($img); 
// 创建一个音乐信息的p标签 
 var $musicMsg = $("<p>"+musicModels[i].musicName+" 演唱者:" 
 +musicModels[i].name 
  +"</p>" 
 ); 
 $musicDiv.append($musicMsg); 
  
 } 
 $(".music").click( 
 function(e){ 
  //从被选中的div中读取自定义 index属性 
  
  player.playIndex = $(this ).data("index"); 
  player.playMusic(); 
  //被选中的div设置musicplay样式,该div的兄弟元素要溢出musicplay样式 
  //保证只有一个div有musicplay 
  $(this).addClass("musicPlay").siblings().removeClass("musicPlay"); 
  
  
 } 
 ); 
 } 
 
 $(".play").click(function(){ 
 player.playOrPause(); 
 }); 
 
 $(".next").click(function(){ 
 player.nextMusic(); 
  
  
 }); 
 $(".pre").click(function(){ 
 player.preMusic(); 
  
  
 }); 
 
 
 })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中parseInt函数浅谈
Jul 31 Javascript
jquery选择器使用详解
Apr 08 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
Jul 31 Javascript
js实现跨域的多种方法
Dec 25 Javascript
ionic实现带字的toggle滑动组件
Aug 27 Javascript
基于jQuery实现的幻灯图片切换
Dec 02 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
May 12 Javascript
Vue安装浏览器开发工具的步骤详解
May 12 Javascript
vue+element加入签名效果(移动端可用)
Jun 17 Javascript
JS实现电脑虚拟键盘的操作
Jun 24 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
Oct 23 Javascript
vue 在单页面应用里使用二级套嵌路由
Dec 19 Vue.js
node.js路径处理方法以及绝对路径详解
Mar 04 #Javascript
聊一聊JS中的prototype
Sep 29 #Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
Sep 29 #Javascript
jquery对Json的各种遍历方法总结(必看篇)
Sep 29 #Javascript
浅析Javascript的自动分号插入(ASI)机制
Sep 29 #Javascript
完美解决IE9浏览器出现的对象未定义问题
Sep 29 #Javascript
JSON 对象未定义错误的解决方法
Sep 29 #Javascript
You might like
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
php !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
2011/01/07 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
top.location.href 没有权限 解决方法
2008/08/05 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
2012/03/07 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
[01:26]DOTA2荣耀之路2:iG,China
2018/05/24 DOTA
在windows系统中实现python3安装lxml
2016/03/23 Python
Python解惑之整数比较详解
2017/04/24 Python
关于Python如何避免循环导入问题详解
2017/09/14 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
python sleep和wait对比总结
2021/02/03 Python
社会实践自我鉴定
2013/11/07 职场文书
计算机网络专业求职信
2014/06/05 职场文书
七夕情人节促销方案
2014/06/07 职场文书
节能减耗标语
2014/06/21 职场文书
小学安全汇报材料
2014/08/14 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
Python基础知识学习之类的继承
2021/05/31 Python
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers