自制 h5 音樂播放器 可搜索

博客地址:https://ainyi.com/59html

閒言碎語:

有好幾天沒有發表博客了,這也是由於一直開發音樂和完善個人博客項目,好不容易抽出時間總結一下這幾天所作的東西,還這麼多課,實則匆忙前端

今天可貴逃了一次課,就趁這時間,該寫寫就寫寫吧~~jquery

 

進入正題:Lily_music

本次開發,參照本人以前所作的 樂詩博客(文末會說到)的相關播放控制等功能,繼續優化的結果。git

前端模仿qq音樂界面,而後在此之上進行修改的界面,並使用了一點 es6 的語法es6

話說我的挺喜歡qq音樂界面的,簡潔,固然也少不了背景模糊插件以及滾動條美化相關插件,github

也用到了彈窗、點擊複製歌曲連接和歌詞連接相關功能,可是目前歌曲分享功能暫未實現、後續....ajax

致謝:歌曲搜索參照某位大佬封裝的 qq 音樂的 api,UI 界面參照另外一位大神的一些解決方案,在此表示感謝正則表達式

 

相關連接:

那麼相關使用的開源插件有:npm

jQuery官方類庫:https://jquery.com/api

layer彈窗插件:http://layer.layui.com/

複製粘貼庫插件:https://www.npmjs.com/package/clipboard-js

mCustomScrollbar滾動條美化插件:http://manos.malihu.gr/jquery-custom-content-scroller/

background-blur背景圖片模糊特效插件:https://msurguy.github.io/background-blur/

還有播放、控制、歌詞解析、搜索、加載動畫sg類庫等功能所有手寫,爽的不行。

 

舒適提醒:

本播放器並不須要什麼特別的運行環境,直接下載打開就能用了 ^_^

響應式優化,可在各類大小的設備運行打開

音樂搜索的結果均來自 qq音樂 (後續會繼續擴大到多個平臺)

本播放器還有一些 bug,需求就是不斷知足的,虛心請教...

 

談談開發:

果斷使用的是 H5 播放器,十分好用

通常在作這種播放器的開發,要多多使用面向對象的開發思想。

定義一個播放器對象,相關參數、方法以下:

播放器對象:krAudio

參數:

  播放器:audioDom

  進度條鎖定:locked:true

  進度條按下的鎖:kdown

  靜音的鎖:flag_volume

  當前音量:curentVoice

  當前播放的列表序號:Currentplay

  當前播放列表歌曲總數:allItem

  播放模式,1爲列表循環:orderModes

方法:

  播放器初始化:init

  設置播放的音樂地址:seturl

  播放:play

  暫停:stop

  播放時間監聽及處理:time

  時間格式化:format

  下一首:next

  上一首:prev

  播放模式:ordermode

  拖動進度條:controlTime

  拖動音量條:controlVoice

上面部分的參數及方法基本涵蓋播放器該有的功能

 

歌詞解析,我以前作的樂詩博客採用本身寫的一種歌詞解析滾動播放的方法:

首先明白通常歌詞的形式是:[00:13.80]指望飛上恬靜月球遙望每家的窗 [00:18.24]誰伴深愛細味露臺玫瑰香

這樣子的形式,利用 ajax 異步請求到歌詞文件,而後就能夠進行字符串裁剪,單單取出時間和歌詞,一一對應

 1     loadLrc:function(){//加載歌詞
 2         var vallrc = $(".hidetextlrc").text();
 3         //若是沒有上傳歌詞或者刪除了歌詞
 4         if(!vallrc || $(".is_deleteLrc").text() == 1){
 5             $(".lrc_content_notext").text("暫無歌詞");
 6             $(".lrc_content_notext").show();
 7             return;
 8         }
 9         var isHrefLrc = $(".is_href_lrc").text();
10         //若是是上傳的歌詞,那就要拼接上服務器地址
11         if(isHrefLrc == 0) vallrc = basePath + "/" + vallrc;
12         $.ajax({  //異步請求獲取本地歌詞
13             url:vallrc,
14             type:"post",
15             success:function(data){
16                 //第一次分離歌詞
17                 var lrcArr = data.split("[");
18                 //存放分離後的歌詞
19                 var html = "";
20                 var lrclast = null; //記錄上一行的歌詞
21                 var lrcmes = null; //記錄當前行的歌詞
22                 var bofo = -1; //記錄上一行歌詞的秒數
23                 var ms = -1; //當前這一行的秒數
24                 for(var i = 0;i < lrcArr.length;i++){
25                     //第二次分割歌詞,變成["03:01.08","這個世界變得更加美麗"],數組以逗號分隔
26                     var arr = lrcArr[i].split("]");
27                     //取到數組arr下標爲1的歌詞部分
28                     //將上一行的歌詞賦值給lrclast
29                     lrclast = lrcmes; 
30                     //獲得當前歌詞
31                     lrcmes = arr[1];
32                     //取到時間
33                     var time = arr[0].split("."); //變成["03:01","08"]
34                     //取到time下標爲0的分鐘和秒
35                     var ctime = time[0].split(":"); //變成["03","01"];
36                     //將上一行的秒數賦值給bofo
37                     bofo = ms;
38                     //轉化成秒數
39                     ms = ctime[0]*60 + ctime[1]*1;
40                     //若是上一行和當前行秒數相同,則當前行秒數++ ,解決秒數相同的辦法
41                     if(bofo == ms){
42                         ms++;
43                     }else if(ms >= 0){
44                         if(!isNaN(bofo)){ //若是是數字
45                             var classeName = "l_"+bofo;
46                             var concon = bofo;//bofo會自增,因此下面for循環條件用這個變量來代替
47                             for(var j = 0;j < ms-concon-1;j++){
48                                 classeName += " l_"+ ++bofo;
49                             }
50                             if(ms>=0 && lrclast != null){
51                                 html += "<li class='"+classeName+"'>"+lrclast+"</li>";
52                             }
53                         }
54                     }
55                 }
56                 //裝載最後一行歌詞的機制,先獲取歌曲總時間
57                 setTimeout(function(){
58                     var allall = krAudio.audioDom.duration;
59                     var classlaName = "l_"+ms;
60                     var conben = ms; //ms會自增,因此下面for循環條件必須用這個變量來代替
61                     for(var j = 0;j < allall-conben-1;j++){
62                         classlaName += " l_"+ ++ms;
63                     }
64                     html += "<li class='"+classlaName+"'>"+lrcmes+"</li>";
65                     //把解析好的歌詞放入歌詞展現區中
66                     $("#lrcly").html(html);
67                     $("#lyrics").html(html);
68                 },200);
69             }
70         });
71         // 聯動音樂播放歌詞
72         krAudio.audioDom.addEventListener("timeupdate",function(){
73             //獲取當前播放時間,得到的是秒數
74             var time = this.currentTime;
75             //解析音樂對應的時間
76             var m = parseInt(time / 60);//獲取此時的分鐘
77             var s = parseInt(time); //轉換int類型,獲取此時的秒數
78             $(".l_"+s).addClass("lrcsel").siblings().removeClass("lrcsel");
79             //歌詞滾動條,使歌詞在中間的計算公式:
80             //第n行歌詞*li的高度-歌詞區域中間的li(就是包括這個li,取這個li的一半)以上的li的總高度
81             //局部歌詞的控制
82             $(".lrc_content_box").stop().animate({
83                 scrollTop:(($(".lrcsel").index()+1)*29 - 145)//減去誤差,使當前歌詞在中間
84             },240);
85             //全屏歌詞的控制
86             $("#lyrics").stop().animate({
87                 scrollTop:(($(".lrcsel").index()+1)*24 - 168)//減去誤差,使當前歌詞在中間
88             },240);
89         });
90     },

這種歌詞解析、聯動播放的進度進行滾動是我以前樂詩博客採用的一種方案,感受也不錯

 

這次採用另外一種解析方式,利用 js 正則表達式所有替換的方式

替換方式:

1 var reg = /-/g;  // g表示所有替換 ,要替換的字符串是-
2 createTime = createTime.replace(reg,"/"); // 第二個參數表示替換成 /
3  //替換成2018/04/03

歌詞解析:

 1 //解析歌詞
 2 function parseLyric(lrc) {
 3     var lyrics = lrc.split("\n");
 4     var lrcText = {};
 5     for(var i=0;i<lyrics.length;i++){
 6         var lyric = decodeURIComponent(lyrics[i]);
 7         var timeReg = /\[\d*:\d*((\.|\:)\d*)*\]/g;
 8         var timeRegExpArr = lyric.match(timeReg);
 9         if(!timeRegExpArr)continue;
10         var clause = lyric.replace(timeReg,'');
11         for(var k = 0,h = timeRegExpArr.length;k < h;k++) {
12             var t = timeRegExpArr[k];
13             var min = Number(String(t.match(/\[\d*/i)).slice(1)),
14                 sec = Number(String(t.match(/\:\d*/i)).slice(1));
15             var time = min * 60 + sec;
16             lrcText[time] = clause;
17         }
18     }
19     return lrcText;
20 }

這樣子解析出來的是一個對象,存放着鍵值對,鍵:時間(秒),值(歌詞)

就能夠直接作一個 for in 循環將每句歌詞添加到歌詞區域,將時間添加到每句歌詞的樣式控制class

根據每句歌詞的時間,就能夠在播放器的 timeupdate 監聽事件裏實現滾動播放歌詞了

 

鼠標拖動進度條的時候,有三個監聽事件,

按下:onmousedown 

移動:onmousemove 

彈起:onmouseup 

這裏鼠標移動事件須要放在鼠標按下事件裏面,當鼠標彈起時,在裏面清除移動、彈起兩個事件,以避免彈起時還執行鼠標按下拖動事件(也能夠定義一把鎖來控制)

 

還有不少細節點的問題,上一曲下一曲臨界值、搜索後的播放控制、列表小菜單與主按鈕之間的聯動、三種播放模式等等等等... 有坑也有歡笑

 

另外給你們提供一個判斷非空的方法:

 1 //判斷非空
 2 function isEmpty(val) {
 3     val = $.trim(val);
 4     if (val == null)
 5         return true;
 6     if (val == undefined || val == 'undefined')
 7         return true;
 8     if (val == "")
 9         return true;
10     if (val.length == 0)
11         return true;
12     if (!/[^(^\s*)|(\s*$)]/.test(val))
13         return true;
14     return false;
15 }

 

ES6 都出來了,那固然要好好使用,在字符串拼接的代碼,均使用 es6 語法,十分好用

 

截圖展現:

 

          

 

項目連接:

在線演示:https://www.ainyi.com/Lily_music/

git:https://github.com/Krryxa/Lily_music

樂詩博客是一個音樂、日記分享平臺,咱們致力於讓用戶發表本身的心情,分享本身喜好的音樂,聆聽你個人聲音。歡迎訪問 ^_^

 

博客地址:https://ainyi.com/59

 

版權全部,轉載請註明出處

相關文章
相關標籤/搜索