jQuery仿QQ音樂播放器

来源:https://www.cnblogs.com/hsiang/archive/2020/04/05/12639967.html
-Advertisement-
Play Games

本文通過Html+CSS+jQuery開發仿QQ版的音樂播放器,是前端技術的綜合應用,所用素材來源於網路,僅供學習分享使用,如有不足之處,還請指正。 ...


本文通過Html+CSS+jQuery開發仿QQ版的音樂播放器,是前端技術的綜合應用,所用素材來源於網路,僅供學習分享使用,如有不足之處,還請指正。

涉及知識點

在本例中用到的知識點如下,按jQuery和CSS進行區分:

jQuery 是一個 JavaScript 庫, 極大地簡化了 JavaScript 編程,常見知識點如下:

  1. 通過標簽獲取jQuery對象:var $audio =$("audio");
  2. 通過選擇符獲取jQuery對象並設置文本內容:$(".music_progrss_time").text(timeStr);
  3. 通過選擇符,標簽名獲取對象並獲取第i個子元素:$(".song_lyric ul li").eq(index);
  4. 通過ajax非同步獲取數據並刷新頁面:$.ajax({});
  5. 通過類選擇符獲取元素併進行隱藏或顯示:$(this).find(".list_menu").stop().fadeIn(100);
  6. 通過委托動態設置單擊事件,主要針對動態生成元素:$(".content_list").delegate(".list_check", "click", function() {});
  7. 通過addClass添加類,removeClass刪除類,toggleClass切換類,hasClass是否包含類
  8. 獲取與對象同級的兄弟節點:$musicList.siblings();
  9. 觸發相關事件:$(".music_next").trigger("click");

CSS通過使用 CSS 我們可以大大提升網頁開發的工作效率!本例使用知識點如下:

  1. 設置距離左邊的距離:margin-left: 20px; 設置距離右邊的距離:margin-right: 20px;
  2. 設置透明度:opacity: 0.6; 值[0,1]從透明到全不透明
  3. 設置背景圖片:background: url(../img/player_logo.png) no-repeat 0 0;設置背景顏色和透明度:background: rgba(255,255,255,0.5);
  4. 設置li的樣式:list-style: none;
  5. 設置顯示樣式為行內塊:display: inline-block;
  6. 設置圓角:border-radius: 5px;
  7. 設置相對位置:position: relative;
  8. 背景圖片的起始坐標:background-position: 0 -75px;

示例效果圖及結構劃分

本例的示例效果圖及結構劃分如下所示:

 

 

 Html核心代碼

Header部分代碼:主要用於顯示logo和登錄顯示,如下所示:

1 <div class="header">
2     <h1 class="logo">
3         <a href="#"></a> --by Alan.hsiang
4     </h1>
5     <ul class="register">
6         <li>登錄</li>
7         <li>設置</li>
8     </ul>
9 </div>

中間區域部分:主要包括坐邊的列表和右邊的歌曲相關,如下所示:

 1 <div class="content">
 2     <div class="content_in">
 3         <div class="content_left">
 4             <div class="content_toolbar">
 5                 <span><i></i>收藏</span>
 6                 <span><i></i>添加到</span>
 7                 <span><i></i>下載</span>
 8                 <span><i></i>刪除</span>
 9                 <span><i></i>清空列表</span>
10             </div>
11             <div class="content_list">
12                 <ul>
13                     <li class="list_title">
14                         <div class="list_check"><i></i></div>
15                         <div class="list_number"></div>
16                         <div class="list_name">歌曲</div>
17                         <div class="list_singer">歌手</div>
18                         <div class="list_time">時長</div>
19                     </li>
20                 </ul>
21             </div>
22         </div>
23         <div class="content_right">
24             <div class="song_info">
25                 <a href="javascript:;" class="song_info_pic">
26                     <img src="" alt="" />
27                 </a>
28                 <div class="song_info_name">歌曲名稱:<a href="javascript:;" class=""></a></div>
30                 <div class="song_info_singer">歌手名:<a href="javascript:;" class=""></a></div>
32                 <div class="song_info_album">專輯名稱:<a href="javascript:;" class=""></a></div>
34             </div>
35             <div class="song_lyric"><ul></ul></div>
37         </div>
38     </div>
39 </div>
40                 

底部區域代碼,主要用於播放相關內容,如下所示:

 1 <div class="footer">
 2     <div class="footer_in">
 3         <a href="javascript:;" class="music_pre" title="上一首"></a>
 4         <a href="javascript:;" class="music_play" title="播放"></a>
 5         <a href="javascript:;" class="music_next" title="下一首"></a>
 6         <div class="music_progress_info">
 7             <div class="music_progress_top">
 8                 <span class="music_progrss_name"></span>
 9                 <span class="music_progrss_time"></span>
10             </div>
11             <div class="music_progress_bar">
12                 <div class="music_progress_line">
13                     <div class="music_progress_dot"></div>
16                 </div>
17             </div>
18         </div>
19         <a href="javascript:;" class="music_mode" title="播放模式"></a>
20         <a href="javascript:;" class="music_fav" title="收藏"></a>
21         <a href="javascript:;" class="music_down" title="下載"></a>
22         <a href="javascript:;" class="music_comment" title="評論"></a>
23         <a href="javascript:;" class="music_only" title="純凈模式"></a>
24         <div class="music_voice">
25             <a href="javascript:;" class="music_voice_info" title="聲音"></a>
26             <div class="music_voice_bar">
27                 <div class="music_voice_line">
28                     <div class="music_voice_dot"></div>
29                 </div>
30             </div>
31         </div>
32     </div>
33 </div>
34         

jQuery功能性核心代碼

在本示例中,從功能上區分,主要分為播放模塊,進度條模塊,歌詞模塊,各個模塊相互獨立,所以進行了適當的封裝。

播放模塊【Play】主要包括歌曲的初始化,播放與暫停,上一首,下一首,播放同步,跳轉等功能,核心代碼如下:

 1 (function(window){
 2     function Player($audio){
 3         return new Player.prototype.init($audio);
 4     }
 5     Player.prototype={
 6         constructor :Player,
 7         musicList:[],
 8         currIndex:-1,
 9         $audio:null,
10         audio:null,
11         init:function($audio){
12             this.$audio=$audio;//jQuey包裝對象
13             this.audio=$audio.get(0);//原生audio對象
14         },
15         play:function(index,music){
16             console.log(index,music);
17             console.log(this.$audio);
18             if(this.currIndex==index){
19                 //同一首音樂,則是暫停,播放之間切換
20                 
21                 if(this.audio.paused){
22                     this.audio.play();
23                 }else{
24                     this.audio.pause();
25                 }
26             }else{
27                 //不是同一首,重新播放
28                 this.$audio.attr('src',music.link_url);
29                 this.audio.play();
30                 this.currIndex=index;
31             }
32         },
33         preIndex:function(){
34             var index=this.currIndex-1;
35             if(index<0){
36                 index=this.musicList.length-1;
37             }
38             return index;
39         },
40         nextIndex:function(){
41             var index=this.currIndex+1;
42             if(index>this.musicList.length-1){
43                 index=0;
44             }
45             return index;
46         },
47         del:function(index){
48             this.musicList.splice(index,1);
49             if(index<this.currIndex){
50                 this.currIndex=this.currIndex-1;
51             }
52         },
53         musicTimeUpdate:function(callBack){
54             //需要一個回調函數作為參數
55             var that=this;
56             //監聽audio播放事件
57             this.$audio.on("timeupdate",function(){
58                 var duration=that.audio.duration;
59                 var currentTime=that.audio.currentTime;
60                 var timeStr=that.formatTime(currentTime,duration);
61                 //參數是一個回調函數
62                 callBack(duration,currentTime,timeStr);
63             });
64         },
65         //定義一個格式化時間的方法
66         formatTime:function (currentTime,duration){
67             //總時長
68             var endMin=parseInt(duration/60);
69             var endSec=parseInt(duration%60);
70             endMin=endMin<10?"0"+endMin:endMin;
71             endSec=endSec<10?"0"+endSec:endSec;
72             //當前時長
73             var curMin=parseInt(currentTime/60);
74             var curSec=parseInt(currentTime%60);
75             curMin=curMin<10?"0"+curMin:curMin;
76             curSec=curSec<10?"0"+curSec:curSec;
77             return curMin+":"+curSec+" / "+endMin+":"+endSec;
78         },
79         musicSeekTo:function(value){
80             var that=this;
81             var duration=that.audio.duration;
82             if(isNaN(duration))return;
83             if(isNaN(value))return;
84             that.audio.currentTime=duration*value ;
85         },
86         musicVoiceSeekTo:function(value){
87             if(isNaN(value))return;
88             if(value<=0 || value>=1) return;
89             this.audio.volume=value;
90         }
91     };
92     Player.prototype.init.prototype=Player.prototype;
93     window.Player=Player;
94 })(window);
View Code

歌詞模塊【lyric】,主要包括歌詞的載入,解析,同步等功能,核心代碼如下:

 1 (function(window){
 2     function Lyric(path){
 3         return new Lyric.prototype.init(path);
 4     }
 5     Lyric.prototype={
 6         constructor :Lyric,
 7         times:[],
 8         lyrics:[],
 9         index:-1,
10         init:function(path){
11             this.path=path;
12         },
13         loadLyric:function(callBack){
14             var that=this;
15             $.ajax({
16                 type: "get",
17                 dataType:"text",
18                 contentType: "application/text; charset=utf-8",
19                 url: that.path,
20                 success: function(data) {
21                     //console.log(data);
22                     that.parseLyric(data);
23                     callBack();
24                 },
25                 error: function(e) {
26                     console.log(e);
27                 }
28             });
29         },
30         parseLyric:function(data){
31             var that=this;
32             //初始化歌詞和時間
33             that.times=[];
34             that.lyrics=[];
35             that.index=-1;
36             //
37             var array=data.split("\n");
38             //console.log(array);
39             var timeReg=/\[(\d*:\d*\.\d*)\]/;
40             $.each(array, function(index,ele) {
41                 //console.log(ele);
42                 //
43                 var lyc=ele.split("]")[1];
44                 if(lyc==null || lyc.length==1){
45                     return true;//排除空字元串
46                 }
47                 that.lyrics.push(lyc);
48                 
49                 var res=timeReg.exec(ele);
50                 //console.log(res);
51                 if(res==null){
52                     return true; //排除空時間
53                 }
54                 var timeStr=res[1];
55                 var res2=timeStr.split(":");
56                 var min=parseInt(res2[0]) *60;
57                 var sec=parseFloat(res2[1]) ;
58                 var res3=parseFloat( Number(min+sec).toFixed(2));
59                 //console.log(res3);
60                 that.times.push(res3);
61             });
62             console.log(that.times.length +"  , "+ that.lyrics.length);
63         },
64         currentLyric:function(currentTime){
65             //console.log(currentTime);
66             if(currentTime>this.times[0]){
67                 this.index++;
68                 this.times.shift();//刪除第一個元素,並返回剩餘的數組
69             }
70             return this.index;
71         }
72     };
73     Lyric.prototype.init.prototype=Lyric.prototype;
74     window.Lyric=Lyric;
75 })(window);
View Code

進度條模塊【Progress】主要包括:進度條的初始化,單擊,拖動,回調等功能,核心代碼如下:

 1 (function(window){
 2     function Progress($progressBar,$progressLine,$progressDot){
 3         return new Progress.prototype.init($progressBar,$progressLine,$progressDot);
 4     }
 5     Progress.prototype={
 6         constructor :Progress,
 7         isMove:false,
 8         init:function($progressBar,$progressLine,$progressDot){
 9             this.$progressBar=$progressBar;
10             this.$progressLine=$progressLine;
11             this.$progressDot=$progressDot;
12         },
13         progressClick:function(callBack){
14             //console.log(this.$progressBar);
15             var that=this;//此時的this表示Progress
16             this.$progressBar.click(function(event){
17                 //此時的this表示progrssBar點擊的對象
18                 var normalLeft = $(this).offset().left;//控制項預設距左邊的位置
19                 var eventLeft = event.pageX;//當前滑鼠點擊的距左邊的位置
20                 that.$progressLine.css("width",eventLeft-normalLeft);
21                 that.$progressDot.css("left",eventLeft-normalLeft);
22                 //計算進度條的比例
23                 var value=(eventLeft-normalLeft)/$(this).width();
24                 callBack(value);
25             });
26         },
27         progressMove:function(callBack){
28             var that=this;//此時的this表示Progress
29             var normalLeft =-1;
30             var eventLeft=-1;
31             var barWidth=this.$progressBar.width();
32             this.$progressBar.mousedown(function(){
33                 that.isMove=true;
34                 normalLeft = $(this).offset().left;//控制項預設距左邊的位置
35                 
36                 $(document).mousemove(function(){
37                     //此時的this表示progrssBar點擊的對象
38                     eventLeft = event.pageX;//當前滑鼠點擊的距左邊的位置
39                     var v=eventLeft-normalLeft;
40                     if(v>=0 && v<=barWidth){
41                         //判斷值的有效範圍再賦值
42                         that.$progressLine.css("width",eventLeft-normalLeft);
43                         that.$progressDot.css("left",eventLeft-normalLeft);
44                     }
45                 });
46             });
47             $(document).mouseup(function(){
48                 $(document).off("mousemove");
49                 that.isMove=false;
50                 //計算進度條的比例
51                 var value=(eventLeft-normalLeft)/that.$progressBar.width();
52                 //滑鼠抬起時觸發,防止音樂斷斷續續
53                 callBack(value);
54             });
55         },
56         setProgress:function(value){
57             if(this.isMove)return;
58             if(value<0 || value>100){
59                 return;
60             }
61             this.$progressLine.css("width",value+"%");
62             this.$progressDot.css("left",value+"%");
63         }
64     };
65     Progress.prototype.init.prototype=Progress.prototype;
66     window.Progress=Progress;
67 })(window);
View Code

載入流程,包括初始化歌曲列表,歌詞信息,註冊事件,初始化進度條等功能,本例中的歌曲列表和歌詞信息,均是通過ajax從本地文件中獲取,核心代碼如下:

  1 $(function() {
  2     var $audio =$("audio");
  3     var player=new Player($audio);
  4     var progress=null;
  5     var voiceProgress=null;
  6     var lyric=null;
  7     	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在SQL Server 2012版本中,當重新啟動SQL Server實例時,表的身份值將被跳轉,而實際跳轉的值取決於身份列數據類型。 如果是整數(int)數據類型,則跳轉值為1000;如果為大整數(bigint),則跳轉值為10000。從我們的應用程式角度來看,此增量不適用於所有業務案例,尤其是當... ...
  • 為了研究一下sql自動化檢查和分析工具,是否有網上介紹的好用,我在本地進行soar 和 soar-web的安裝和使用。 初步的實驗結果,總結如下: 1. 安裝相對來說較為麻煩,特別是soar-web的依賴包安裝,涉及到python pip相關組件的下載安裝。 2. 啟動soar-web會遇到一些奇怪 ...
  • 本文源碼: "GitHub·點這裡" || "GitEE·點這裡" 一、伺服器性能簡介 1、性能定義 伺服器性能優化是一項非常艱巨的任務,當然也是很難處理的問題,在寫這篇文章的時候,特意請教下運維大佬,硬體工程師,資料庫管理,單從自己的實際開發經驗來看,看待這個問題的角度起碼是不全面的。 :在公司靠 ...
  • 前言: 《讀者來信》是HBase老店開設的一個問答專欄,旨在能為更多的小伙伴解決工作中常遇到的HBase相關的問題。老店會儘力幫大家解決這些問題或幫你發出求救貼,老店希望這會是一個互幫互助的小平臺。有問題請直接在老店後臺留言,有好的解決方案也請不要吝嗇,誠摯歡迎大家能在留言區積極探討解決方案,大膽發 ...
  • Spark SQL是Spark用來處理結構化數據的一個模塊,它提供了一個編程抽象叫做DataFrame並且作為分散式SQL查詢引擎的作用。為什麼要學習Spark SQL?如果大家瞭解Hive的話,應該知道它是將Hive SQL轉換成MapReduce然後提交到集群上執行,大大簡化了編寫MapRedu ...
  • 在工作中,有時候只是想簡單看下HBase表某些關鍵指標的值,這個時候總不能現寫Java代碼去查看,以下幾個小技巧你可能會經常用到。 1. 某行有許多列,只想獲取指定2~3列的數據 2. 想看某個欄位多個版本的數據 3. 想看被16進位化的中文或數字 對於Int型、Long型數值,支持toInt|to ...
  • 老孟導讀:在前面的文章中介紹了 《Flutter 動畫系列》25種動畫組件超全總結 "http://laomengit.com/flutter/module/animated_1/" 《Flutter 動畫系列》Google工程師帶你選擇Flutter動畫控制項: "http://laomengit. ...
  • 當圖片還沒載入完成時,可以通過loading組件填充空白區 效果圖 components/loading/index.vue <template> <div class="mine-loading" :class="{'me-loading-inline':inline}"> <span class ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...