HTML5+JavaScript+CSS实现音乐播放器——难点二:自己设计一个控制音乐播放的控制器
2017-10-22 10:55
537 查看
我们都知道HTML5给我们提供了"controls"这个插件,可是这个插件却比较丑,还不能实现上一首下一首的播放,以及进度条的手动改变等功能,那么如何自己设计一个控制音乐播放的控制器呢?下图是我设计的控制器。
![](https://img-blog.csdn.net/20171120091059355?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvUml0YWppYW9qaWFv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这里添加监听器的目的是解决获取到的总时间显示为NaN:NaN,其中还用到一个format函数,因为通过oAudio.duration获得的是以秒为单位的数据,所以要将其转化成分:秒的格式需要一个格式转换函数:
HTML代码:
这样在JS中需要通过onClick点击事件给audio的src赋值,下面以播放暂停按钮为例。
(1)随机播放的实现需要用到随机数生成函数,将生成的随机数作为歌曲的一个下标,获取响应的歌曲信息,从而播放。
(2)单曲循环的实现比较简单,只需要将audio对象的loop属性设置成true即可。
(3)列表循环的实现只需要触发下一首的点击事件即可。
在做时发现歌曲播放完毕并不会自动切换到下一首,需要对audio的"ended"属性添加监听事件。
1.获取总时间以及当前播放时间的实现:
var oTotal=document.getElementsByClassName("total_time")[0]; window.onload=function () { oAudio.addEventListener("canplay", function() { oTotal.innerHTML=format(oAudio.duration); //获取总时间 }); }
这里添加监听器的目的是解决获取到的总时间显示为NaN:NaN,其中还用到一个format函数,因为通过oAudio.duration获得的是以秒为单位的数据,所以要将其转化成分:秒的格式需要一个格式转换函数:
//时间的格式化 function format(t) { var m=Math.floor(t/60); var s=Math.floor(t%60); if(m<=9) //小于10时,在前面填0 m="0"+m; if(s<=9) s="0"+s; return m+":"+s; }
2.播放、暂停上一首下一首的设置:
此功能的实现比较简单,在JS中只需通过onClick点击事件给audio的src赋值。HTML代码:
<audio src="" id="audio"></audio> <div class="foot"> <i class="iconfont icon-kuaitui" title="上一首"></i> <span class="play"><i class="iconfont icon-zanting" title="播放"></i></span> <i class="iconfont icon-kuaijin" title="下一首"></i> <div class="progress"> <span class="current_time">00:00</span> <div class="progress_range"><div class="range"></div><div class="circle"></div></div> <span class="total_time">00:00</span> </div> <div class="model"> <div class="volume"><span class="iconfont icon-shengyin" title="静音"></span></div> <div class="volume_range"><div class="range"></div><div class="circle"></div></div> <div class="bofangModel"><span class="iconfont icon-suiji" title="随机播放"></span></div> </div> </div>
这样在JS中需要通过onClick点击事件给audio的src赋值,下面以播放暂停按钮为例。
var oAudio=document.getElementById("audio"); var oPlay=document.getElementByClassName("play")[0]; var clickNum=0; //用于判断是要播放还是暂停 oAudio.setAttribute("src","/audioFile/1.mp3"); //给audio对象设置src属性 oPlay.onclick()=function(){ if(clickNum==0){ oAudio.play(); //播放 oPlay.innerHTML="<i class='iconfont icon-bofang' title='暂停'></i>"; //改变图标 clickNum=1; }else{ oAudio.pause(); //暂停 oPlay.innerHTML="<i class='iconfont icon-zanting' title='播放'></i>"; clickNum=0; } }
3.手动改变进度的实现:
总体思路即通过windows的ev对象获取鼠标的移动位置,判断其距本模块最左端的位置,从而设置颜色、小圆的位置以及currentTime
var oProgress=document.getElementsByCl a1d2 assName("range")[0]; var oMaxProgress=document.getElementsByClassName("progress")[0]; var oProgress_circle=document.getElementsByClassName("circle")[0]; var oCurrent=document.getElementsByClassName("current_time")[0]; oAudio.play(); setInterval(setProgress,1000); //通过定时器设置进度的自动改变 //设置进度的自动移动 function setProgress() { oCurrent.innerHTML=format(oAudio.currentTime); //设置当前时间的显示 oProgress.style.width=(oAudio.currentTime)/(oAudio.duration)*780+"px"; //780px是总宽度 oProgress_circle.style.left=oProgress.style.width; } //可以点击轨道改变进度 oMaxProgress.onmousedown=function (ev) { changeProgress(ev); } //鼠标拖动小圆改变进度 oProgress_circle.onmousedown=function (ev) { document.onmousemove=function (ev) { changeProgress(ev); } document.onmouseup = function () { //当鼠标松开后关闭移动事件和自身事件 document.onmousemove = null; document.onmouseup = null; } return false; } function changeProgress(ev){ var ev=ev||event; var l = ev.clientX - 270; //获取圆距左端的距离 if(l<0){ l=0; } else if (l > 780) { l = 780; } oProgress_circle.style.left=l+"px"; oProgress.style.width=l+"px"; oAudio.currentTime=(l/780)*oAudio.duration; //设置当前时间,以改变真正的播放进度 oCurrent.innerHTML=format(oAudio.currentTime); //当前时间 }
4.播放模式的切换:
播放模式有三种:随机播放、单曲循环、列表循环。(1)随机播放的实现需要用到随机数生成函数,将生成的随机数作为歌曲的一个下标,获取响应的歌曲信息,从而播放。
(2)单曲循环的实现比较简单,只需要将audio对象的loop属性设置成true即可。
(3)列表循环的实现只需要触发下一首的点击事件即可。
在做时发现歌曲播放完毕并不会自动切换到下一首,需要对audio的"ended"属性添加监听事件。
var oBofangModel=document.getElementsByClassName("bofangModel")[0]; var clickNum3=0; //刚加载,clickNum3=0,不触发点击事件,默认初始为随机播放 if(clickNum3==0){ oAudio.loop=false; oAudio.addEventListener("ended", suiji, false); //监听函数不能加括号 } //播放模式的切换 oBofangModel.onclick=function () { if(clickNum3==0){ oBofangModel.innerHTML="<span class='iconfont icon-liebiaoxunhuan' title='列表循环'></span>"; clickNum3=1; oAudio.loop=false; // oAudio.removeEventListener("ended",function () {..},false); //匿名取消事件无效 oAudio.removeEventListener("ended",suiji,false); oAudio.addEventListener("ended", liebiao, false); } else if(clickNum3==1){ oBofangModel.innerHTML="<span class='iconfont icon-danquxunhuan1' title='单曲循环'></span>"; clickNum3=2; oAudio.loop=true; } else if(clickNum3==2){ oBofangModel.innerHTML="<span class='iconfont icon-suiji' title='随机播放'></span>"; clickNum3=0; if(oAudio!=null){ oAudio.loop=false; oAudio.removeEventListener("ended",liebiao,false); oAudio.addEventListener("ended", suiji, false); } } } //列表循环,触发下一首的点击事件 function liebiao(){ oNext.onclick(); } //产生随机数,自动播放 function suiji() { var m=Math.floor(Math.random()*oMusic.length);//产生随机数,范围为0到oMusic.length-1, playSong(m); } //播放当前歌曲 function playSong(index) { localStorage.setItem("index",index); //存储到本地,方便存取 setInfo(); oAudio.play(); setInterval(setProgress,1000); } //设置列表信息 function setInfo() { var m=parseInt(localStorage.getItem("index")); oAudio.setAttribute("src",oMusic[m].src); }
相关文章推荐
- HTML5+JavaScript+CSS实现音乐播放器——难点二:自己设计一个控制音乐播放的控制器
- 控制音乐播放器的退出再次播放相同音乐的功能实现
- 用C#和vs2015编写了一个简单音乐播放器,实现功能,多条音乐导入,播放、暂停、上下曲。采用vs2105自带的一个播放器控件
- 设计一个音乐播放器,用List列表显示手机中所有音乐,支持播放、暂停、继续、上一首、下一首等功能。
- 如何在自己的信息管理系统里集成第三方权限控制组件 - 设计一个漂亮的WEB界面
- Unity中实现在切换场景时控制音乐的同步播放
- Android中通过耳机按键控制音乐播放的实现
- 用SurfaceView,Timer以及Handler实现的一个带有音乐和文字的电子相册,可以自动播放~
- 自己动手设计并实现一个linux嵌入式UI框架(设计)
- 在开发板S3C2440中如何用自带的QT去设计一个界面来实现控制摄像头,这个界面的框架图是怎样的
- Android音乐播放器---实现Notification控制音乐播放
- 自己动手写类似酷狗播放器(2)_音乐播放模块实现
- 音乐播放器项目技术之一音乐播放进度及音量的控制
- Android音乐播放器---实现Notification控制音乐播放
- 自己实现一个IOC(控制翻转,DI依赖注入)容器
- 自己动手设计并实现一个linux嵌入式UI框架
- 音乐播放器--简单实现播放、暂停、随机播放、音乐进度条(第一版)
- 自己动手开发音乐播放器《五》播放功能的实现
- 分享一个与硬件通讯的分布式监控与远程控制程序的设计(中:通讯协议设计与实现)
- 自己设计一个时钟程序并实现破解