1. 程式人生 > >實現簡單的自定義音樂播放器

實現簡單的自定義音樂播放器

這篇部落格只是記錄自己寫的js外掛,著重點在於js,而不是css或者html。所以在js方面會比較詳細,而其他的就只是簡單提提。

剛學前端js那會,只是應付式的把書看完了,demo也沒寫幾個。碰巧這學期的網頁設計課程接近期末,老師要求要完成一個期末設計。好吧,就拿它來練練手了。just do it,搞起。這段時間對音樂和MV比較感興趣,於是就打算做一個分享音樂、MV的分享網站。要想做這樣一個網站有樣東西是必須要完成的,沒錯,就是一個有特色的播放器。

一:首先看看別人家(QQ音樂)的播放器:


分析:(1):先提取出別人家播放器的幾個功能。

1、播放/暫停 

2、左右切換歌曲 

3、調節音量

4、迴圈方式

5、彈出歌曲列表

6、顯示音樂資訊(專輯圖片、歌手、歌名)

7、彈出/收起 播放器

8、顯示播放進度條

(2):再看佈局

這只是我自己簡單的分析,並沒有根據它的原始碼來分析(好像有點不負責任)所以佈局可能與它程式碼實現的佈局會有點出入。但最後的效果是一樣的就沒多大關係。

二:分析自己的簡單播放器

既然是簡單的,那麼就不需要把別人家播放器的所有功能完成,當然,如果想做的話還是可以的。

(1)簡單版本的播放器的功能。

1、彈出/收起 播放器

2、左右切換歌曲 

3、播放/暫停 

4、顯示音樂資訊(專輯圖片、歌手、歌名)

(2)佈局。功能的減少,意味著按鈕的減少,所以佈局相比會比較簡單。畢竟是簡單版本的嘛。。呵呵

不知道看懂了沒有,畢竟每個程式猿都是靈魂畫師...還是上最後的效果圖,和設計圖作對比吧。

三:程式碼實現

根據上面的設計圖,用程式碼實現佈局

html程式碼:

<!--開始設定播放器-->
<div class="playutil">
    <audio id="aud" src="source/MyLove.mp3"></audio>
    <div class="playtouming"></div>
    <!--開始設定佈局-->
    <!-- 專輯圖片-->
    <div class="songimgdiv"><img src="img/songimg.jpg"/></div>
    <!--播放按鈕-->
    <div class="control">
        <p id="musicinfo">My Love - mylover</p>
        <div class="buttons">
            <a id="nextleftbtn" onMouseOver="overchangleft()" onMouseOut="outchangleft()" onclick="nextleft()">
		<img id="leftbutton" src="img/pleft.png"/>
	    </a>
            <a id="playbtn" onMouseOver="overchangplay()" onMouseOut="outchangplay()" onclick="musicplay()">
		<img id="playbutton" src="img/pplay.png"/>
	    </a>
            <a id="nextrightbtn" onMouseOver="overchangright()" onMouseOut="outchangright()" onclick="nextright()">
		<img id="rightbutton" src="img/pright.png"/>
	    </a>
        </div>
    </div>
    <!--右邊開關按鈕-->
    <div class="playdivbtn">
        <a id="on" onclick="onutil()"><img src="img/right.png"/></a>
        <a id="off" onclick="offutil()"><img src="img/left.png"/></a>
    </div>
</div>


這裡說明一下,這個自定義播放器是基於html5的一個<audio>標籤完成的,所以這個標籤是必須的。而且我想做一個透明的效果,所以在裡面放置了一個class=playtouming的<div>。目前只有這種方案實現透明效果。具體的可以查詢其他資料。

css程式碼

.onutil {  
    transition: left ease .5s;  
    left: 0px;  
}  
.offutil{
    transition:left ease .5s;
    left: -462px;
}
.playutil {  
    z-index: 100;  
    position: fixed;  
    bottom: 125px;  
    left: -462px;  
    width: 485px;  
    height: 115px;  
    border: 1px solid #433B38;  
    border-radius: 0px 4px 4px 0px;  
    box-shadow: 3px 3px 5px 3px rgba(0, 0, 0, 0.5);  
}  
.playutil .playtouming {  
    width: 485px;  
    height: 115px;  
    opacity: 0.85;  
    filter: alpha(opacity=85);  
    background-color: #433B38;  
}  
  
.songimgdiv {  
    position: absolute;  
    top: 0px;  
    margin: 8px;  
    margin-left: 20px;  
    border: 1px solid #433B38;  
    border-radius: 4px;  
    box-shadow: 1px 1px 2px 2px rgba(255, 255, 255, 0.3);  
}  
.control {  
    position: absolute;  
    top: 0px;  
    left: 130px;  
    width: 330px;  
}  
.control>p {  
    width: 330px;  
    text-align: center;  
    margin: 15px auto;  
    color: #FFFFFF;  
    size: 5px;  
}  
.buttons {  
    text-align: center;  
}  
.buttons a {  
    margin: 0px 15px;  
}  
.playdivbtn {  
    width: 23px;  
    position: absolute;  
    top: 0px;  
    right: 0px;  
}

這裡首先根據每一個功能來分析一下實現的思路。

前提,為了實現彈出/收起 播放器功能,添加了兩個按鈕。但這樣子網頁一載入完就會出現兩個按鈕(有一個在它下面),所以添加了一個方法,當網頁載入完時讓收起按鈕隱藏,這時播放器是收起狀態。

1、彈出/收起 播放器

給最右側的播放器開關按鈕點選事件,當播放器是收起的狀態時點選,給它新增一個onutil樣式(具體是什麼可以看上面的css),然後替換按鈕圖片為收起按鈕。當播放器是開啟狀態時,先把onutil樣式去掉,再給它新增offutil樣式,再替換掉開關按鈕圖片。

2、左右切換歌曲&& 顯示音樂資訊(專輯圖片、歌手、歌名)

因為這是純前端的外掛,所以歌曲本身不是從後臺獲取的。為了模擬這樣的情況就先把歌曲路徑放到一個數組裡,歌曲存放在source的資料夾下。當切換歌曲時,有三樣東西是需要改變的。一是歌曲,二是歌曲專輯圖片(我這裡沒做..),三是歌曲資訊。所以點選切換歌曲按鈕時,首先判斷下標是否越界,越界的話置0,讓它從第一首歌曲開始播放。從數組裡獲取路徑後,改變<audio>獲取歌曲的路徑,然後改變歌曲資訊。當然,如果要改變專輯圖片的話還要改變圖片路徑。

3、播放/暫停 

這個功能比較簡單實現,就是給播放/暫停按鈕點選事件,這個方法裡面要做的就是改變<audio>的播放狀態,然後替換按鈕圖片。

這裡還實現了一個效果,就是滑鼠經過按鈕時都會發亮。其實就是替換了圖片,給所有按鈕新增滑鼠經過事件,再換圖片OK了。以上都是簡單地說一下實現的思路,具體的實現方法還是主要看氣質,不不不,錯了。主要看程式碼!

js程式碼:

    <script type="text/javascript">
        $(document).ready(function(){
            $("#off").hide();
            $("#stopbtn").hide();
        });
    </script>
	var musicarray=new Array();
    var musicIndex=0;
    musicarray[0]="source/MyLove.mp3;-mylover";
    musicarray[1]="source/Clean.mp3;-Taylor";
    musicarray[2]="source/Gentleman.mp3;-unknown"
    //播放器div
    function onutil() {
        $(".playutil").removeClass("offutil");
        $(".playutil").addClass("onutil");
        $("#on").hide();
        $("#off").show();
    }
    function offutil() {
        $(".playutil").removeClass("onutil");
        $(".playutil").addClass("offutil");
        $("#off").hide();
        $("#on").show();
    }
    //播放器控制元件
    function musicplay() {
        var audio=document.getElementById('aud');
        if(audio.paused){
            audio.play();
            document.getElementById("playbutton").src="img/pstop.png";
        }else{
            audio.pause();
            document.getElementById("playbutton").src="img/pplay.png";
        }
    }

    //改變滑鼠經過時圖片
    function overchangleft() {
        document.getElementById("leftbutton").src="img/pleft_hover.png";
    }
    function overchangplay() {
        var audio=document.getElementById('aud');
        if(audio.paused) {
            document.getElementById("playbutton").src = "img/pplay_hover.png";
        }else{
            document.getElementById("playbutton").src = "img/ppstop_hover.png";
        }
    }
    function overchangright() {
        document.getElementById("rightbutton").src="img/pright_hover.png";
    }
    function outchangleft() {
        document.getElementById("leftbutton").src="img/pleft.png";
    }
    function outchangplay() {
        var audio=document.getElementById('aud');
        if(audio.paused) {
            document.getElementById("playbutton").src = "img/pplay.png";
        }else{
            document.getElementById("playbutton").src = "img/pstop.png";
        }
    }
    function outchangright() {
        document.getElementById("rightbutton").src="img/pright.png";
    }
    //上一首
    function nextleft() {
        if(musicIndex-1<0){
            var audio=document.getElementById('aud');
            audio.src=musicarray[musicarray.length-1].split(";")[0];
            audio.play();
            musicIndex=musicarray.length-1;
            $("#musicinfo").text(musicarray[musicIndex].split(";")[0].split("/")[1].split(".")[0]+musicarray[musicIndex].split(";")[1]);
            document.getElementById("playbutton").src="img/pstop.png";
        }else{
            var audio=document.getElementById('aud');
            audio.src=musicarray[musicIndex-1].split(";")[0];
            audio.play();
            musicIndex-=1;
            $("#musicinfo").text(musicarray[musicIndex].split(";")[0].split("/")[1].split(".")[0]+musicarray[musicIndex].split(";")[1]);
            document.getElementById("playbutton").src="img/pstop.png";
        }
    }
    //下一首
    function nextright(){
        if(musicIndex+1>=musicarray.length){
            var audio=document.getElementById('aud');
            audio.src=musicarray[0].split(";")[0];
            audio.play();
            musicIndex=0;
            $("#musicinfo").text(musicarray[musicIndex].split(";")[0].split("/")[1].split(".")[0]+musicarray[musicIndex].split(";")[1]);
            document.getElementById("playbutton").src="img/pstop.png";
        }else{
            var audio=document.getElementById('aud');
            audio.src=musicarray[musicIndex+1].split(";")[0];
            audio.play();
            musicIndex+=1;
            $("#musicinfo").text(musicarray[musicIndex].split(";")[0].split("/")[1].split(".")[0]+musicarray[musicIndex].split(";")[1]);
            document.getElementById("playbutton").src="img/pstop.png";
        }
    }

四:結尾

這個自定義的播放器功能還是比較簡單的,實現起來也不算複雜。所以有興趣的可以繼續完善。最後希望一起努力,不忘初心。