實現簡單的自定義音樂播放器
剛學前端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";
}
}