HTML5+JavaScript+CSS实现音乐播放器——难点二:本身设计一个控制音乐播放的控制器

 

咱们都知道HTML5给咱们提供了"controls"这个插件,但是这个插件却比较丑,还不能实现上一首下一首的播放,以及进度条的手动改变等功能,那么如何本身设计一个控制音乐播放的控制器呢?下图是我设计的控制器。javascript

1.获取总时间以及当前播放时间的实现:html

var oTotal=document.getElementsByClassName("total_time")[0];
window.onload=function () {
    oAudio.addEventListener("canplay", function() {
        oTotal.innerHTML=format(oAudio.duration);       //获取总时间
    });
}

这里添加监听器的目的是解决获取到的总时间显示为NaN:NaN,其中还用到一个format函数,由于经过oAudio.duration得到的是以秒为单位的数据,因此要将其转化成分:秒的格式须要一个格式转换函数:java

//时间的格式化
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.播放、暂停上一首下一首的设置:windows

此功能的实现比较简单,在JS中只需经过onClick点击事件给audio的src赋值。dom

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赋值,下面以播放暂停按钮为例。oop

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对象获取鼠标的移动位置,判断其距本模块最左端的位置,从而设置颜色、小圆的位置以及currentTimeui

 

var oProgress=document.getElementsByClassName("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.播放模式的切换:spa

播放模式有三种:随机播放、单曲循环、列表循环。插件

(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);
}
相关文章
相关标签/搜索