這篇文章為大家講如何用JSd代碼實現(xiàn)音樂播放。
音樂播放的主要js代碼
音樂數(shù)據(jù)的數(shù)組對象
這里不僅有前端網(wǎng)頁提供數(shù)據(jù),還有為后面的js代碼提供了音樂路徑,分享給大家。
{ ablum: "海闊天空", artist: "Beyond", id: 1, name: "大地", path: "musics/1592373302464.mp3", size: 4147913, style: "搖滾", uptime: 1592373302000 }, { ablum: "xxx", artist: "GALA ", id: 2, name: "追夢赤子心", path: "musics/1592373330188.mp3", size: 8357216, style: "搖滾", uptime: 1592373330000 }, { ablum: "123", artist: "筷子兄弟", id: 3, name: "父親", path: "musics/1592373363687.mp3", size: 12050851, style: "懷舊", uptime: 1592373363000 }, { ablum: "xxx", artist: "Bruno Mars ", id: 4, name: "Just The Way You Are", path: "musics/1592383891287.mp3", size: 3602925, style: "搖滾", uptime: 1592383891000 }, { ablum: "xxx", artist: "Jason Chen", id: 5, name: "童話", path: "musics/1592383916578.mp3", size: 4143707, style: "流行", uptime: 1592383916000 },
全局變量
//創(chuàng)建音頻播放器對象 var player =document.createElement('audio'); //設(shè)置當前正在播放的歌曲的索引 var currentIndex=0; //聲明一個標記,記錄歌曲的播放狀態(tài) var isplay=false;
自調(diào)用函數(shù)
主要功能是通過循環(huán)遍歷使用html字符串向前端動態(tài)的添加音樂數(shù)據(jù),并初始化播放源(currentIndex標記)
(function() { //綁定數(shù)據(jù)到頁面中 var html = ''; //循環(huán)遍歷歌曲列表,根據(jù)歌曲數(shù)目在頁面生成對應(yīng)的html代碼 for (var i = 0; i < musics.length; i++) { var m = musics[i]; //根據(jù)循環(huán)的次數(shù)創(chuàng)建對應(yīng)的歌曲項 html += `<tr class="music-item" data-index="${i}"> <td class="tb-space" style="text-align: center"></td> <td><a href="javascript:;">${m.name}</a></td> <td><a href="javascript:;">${m.artist}</a></td> <td><a href="javascript:;">${m.ablum}</a></td> <td>${fmtSize(m.size)}</td> <td class="tb-space"></td> </tr>`; } //將生產(chǎn)html插入到指定的dom節(jié)點中 document.getElementById('tbody').innerHTML = html; //初始化播放源 player.src=musics[currentIndex].path; })();
添加點擊事件
循環(huán)遍歷的給所有的音樂對象添加點擊事件
//為列表項觸發(fā)點擊事件 var trs = document.querySelectorAll('.music-item'); for (var i=0;i<trs.length;i++) { trs[i].addEventListener('click',function () { //清除狀態(tài) clearstatus(); var index = this.dataset.index; //記錄當前播放的歌曲索引 currentIndex=index; //獲取需要播放的對象 var m = musics[index]; //設(shè)置播放源 player.src=m.path; startPlay(); })
上面有缺陷就是沒有清除上一首音樂,下面就講講封裝方法。
封裝方法
1.清除上一首歌曲方法
2.開始播放方法(同時將全局變量isplay設(shè)置為true)
3.暫停播放方法(同時將全局變量isplay設(shè)置為false)
4.將總時長s轉(zhuǎn)變成mm:ss
5.將大小B裝化為MB
//清除上一首歌的歌曲狀態(tài) function clearstatus() { //還原上一首正在播放的歌曲表的背景顏色 trs[currentIndex].style.background=''; //清除當前行下的第一個單元格的內(nèi)容(清除圖標) trs[currentIndex].getElementsByTagName('td')[0].innerHTML='' } //開始播放 function startPlay() { //將狀態(tài)標記為正在播放 isplay=true; //播放 player.play(); //修改當前行的背景色 trs[currentIndex].style.background='#f0f0f0'; trs[currentIndex].getElementsByTagName('td')[0].innerHTML='<img src="imgs/playing-list.gif" alt="">' //將播放按鈕的背景圖片設(shè)置為暫停圖標 document.getElementById('btnPlay').className='btn-pause'; //將正在播放的歌曲名顯示到底部控制區(qū)域 document.getElementById('playingName').innerText=musics[currentIndex].name; } //暫停播放 function pausePlay(){ isplay=false; player.pause(); document.getElementById('btnPlay').className='btn-play'; } //格式化歌曲播放時間 mm:ss function fmtTime(time) { time*=1000; //使用毫秒構(gòu)建日期對象 time=new Date(time); var m = time.getMinutes(); var s = time.getSeconds(); m=m<10?'0'+m:m; s=s<10?'0'+s:s; return m+':'+s; } //大小轉(zhuǎn)化 function fmtSize(size) { size=size/(1024*1024); size=size.toFixed(1); return size+'MB';
播放控制按鈕
就是暫停和播放按鈕
判斷全局變量isplay,如果是true說明當前正在播放歌曲,點擊就會暫停,反之就會播放
//播放控制 document.getElementById('btnPlay').addEventListener('click',function () { if (isplay){ pausePlay(); } else{ startPlay(); } });
將當前歌曲的播放時長與總時長在界面上動態(tài)改變
//記錄歌曲的當前播放時間 var now =0; //記錄歌曲的總播放時長 var total=0; //當播放器的數(shù)據(jù)被加載時觸發(fā) player.addEventListener('loadeddata',function () { //獲取當前播發(fā)器的播放位置以及總播放時長(單位s) now=player.currentTime; total=player.duration; //將歌曲的播放時間顯示到控制區(qū)域 document.querySelector('.play-current').innerText=fmtTime(now); document.querySelector('.play-duration').innerText=fmtTime(total); })
為進度條綁定進度改變事件
原理很簡單,通過上面的時間變化求得百分比,設(shè)置為進度的百分比就OK了
//為播放器綁定播放進度改變事件 player.addEventListener('timeupdate',updateProgress); function updateProgress() { //獲取當前的播放進度 now=player.currentTime; //計算進度的百分比 var p =now/total*100+'%'; document.querySelector('.progress-control').style.width=p; document.querySelector('.play-current').innerText=fmtTime(now); }
為播放器綁定播放完成事件以及上下首的切換
現(xiàn)在就清除上一首歌曲的播放,就要用到改變?nèi)肿兞縞urrentIndex的。
//為播放器綁定播放完成事件 player.addEventListener('ended',function () { //清除上一首播放狀態(tài) clearstatus(); currentIndex++; if(currentIndex>=musics.length){ currentIndex=0; } //重新為播放器設(shè)置播放源 player.src=musics[currentIndex].path; //繼續(xù)播放 startPlay(); }); //上一首 document.querySelector('.btn-pre').addEventListener('click',function () { clearstatus(); currentIndex--; if(currentIndex<0){ currentIndex=musics.length-1; } //重新為播放器設(shè)置播放源 player.src=musics[currentIndex].path; //繼續(xù)播放 startPlay(); }); //下一首 document.querySelector('.btn-next').addEventListener('click',function () { clearstatus(); currentIndex++; currentIndex=currentIndex%musics.length; //重新為播放器設(shè)置播放源 player.src=musics[currentIndex].path; //繼續(xù)播放 startPlay(); });
通過進度條控制歌曲播放
對鼠標進行監(jiān)聽,得到鼠標最后的落點,計算出進度條的起始位置與該點占據(jù)總長度的比例,然后簡單的數(shù)學運算,我們知道歌曲總長度就很清楚的得到鼠標落點的歌曲該播放的位置
//改變歌曲的播放進度 (function(box,bar) { //監(jiān)聽鼠標是否按下 var status=false; //鼠標按下事件監(jiān)聽 document.querySelector(box).addEventListener('mousedown',function (e) { player.removeEventListener('timeupdate',updateProgress); move(e); status=true; }) //鼠標抬起事件監(jiān)聽 document.addEventListener('mouseup',function () { player.currentTime=now; player.addEventListener('timeupdate',updateProgress); status=false; }) //鼠標移動事件監(jiān)聽 document.querySelector(box).addEventListener('mousemove',function (e) { if(status==true){ move(e) } }) //鼠標滑動執(zhí)行 function move(e) { var eventLeft=e.offsetX; var w=window.getComputedStyle(document.querySelector(box)).width; var w1=window.getComputedStyle(document.querySelector('.play-current')).width; var w2=window.getComputedStyle(document.querySelector('.play-duration')).width; w1=parseInt(w1); w2=parseInt(w2); document.querySelector(bar).style.width=eventLeft+w1+'px'; now=(eventLeft)/(parseInt(w)-w1-w2)*total; status=true; // var eventLeft=e.offsetX; // document.querySelector(bar).style.width=eventLeft+'px'; // var w=window.getComputedStyle(document.querySelector(box)).width; // now=eventLeft/parseInt(w)*total; // status=true; } })('.play-length','.progress-control');
后續(xù)更多精彩內(nèi)容,歡迎關(guān)注。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/127773.html
摘要:,在聽音樂的時候忽然想聽騰格爾的鋼鐵之翼隱形的翅膀,在網(wǎng)易云上卻找不到,就很氣。于是想到了做一個,音樂搜索的功能,把所有想聽的歌,能夠一次性在酷狗網(wǎng)易云蝦米等平臺上找找完。本項目非常適合新手練習熟悉全家桶,歡迎哦。 React-music React Music WebApp,在聽音樂的時候忽然想聽騰格爾的鋼鐵之翼(隱形的翅膀),在網(wǎng)易云上卻找不到,就很氣。于是想到了做一個,音樂搜索的...
前言:當下音樂播放器不勝其數(shù),為了更好的掌握一些東西,我們來自己制作一個音樂播放器。 文章目錄: 一.開發(fā)環(huán)境:二.頁面視圖:1.主文件入口(首頁):2.音樂播放界面: 三.功能實現(xiàn)(1)、index.html:(2)、播放音樂(music.html):(3)、樣式文件(index.css): 四.項目地址: 一.開發(fā)環(huán)境: 開發(fā)工具:HbuliderX; 框架:Vant,Mui,V...
摘要:概述項目是基于,成品是一個移動端的音樂播放器,來源于的實戰(zhàn)課程。播放器是全局組件,放在下面,通過傳遞數(shù)據(jù),觸發(fā)提交,從而使播放器開始工作。將請求的數(shù)據(jù)格式化后再通過傳遞,組件間共享,實現(xiàn)歌曲的播放切換等。 概述 項目是基于Vue.js,成品是一個移動端的音樂播放器,來源于imooc的實戰(zhàn)課程。自己動手實踐并加以修改拓展。項目的大致流程是Vue-cli構(gòu)建開發(fā)環(huán)境,分析需求,設(shè)計構(gòu)思,規(guī)...
摘要:前些天偷臺風的閑暇時寫了一個移動端音樂播放器,作為練手項目。有的歌詞周杰倫算什么男人格式是時間點時間歌詞創(chuàng)建映射首先以將歌詞字符串分割成以時間點文字的數(shù)組,但由于這樣分割之后最后一個元素是空的,所以用刪除最后一個元素。 這段時間公司一直在做一個PC的教育類單頁應(yīng)用,龐大復雜,涉及非常多H5的知識,音頻就是其中的一部分。前些天偷臺風的閑暇時寫了一個移動端音樂播放器,作為練手項目。 在線地...
閱讀 566·2023-03-27 18:33
閱讀 755·2023-03-26 17:27
閱讀 656·2023-03-26 17:14
閱讀 608·2023-03-17 21:13
閱讀 541·2023-03-17 08:28
閱讀 1829·2023-02-27 22:32
閱讀 1324·2023-02-27 22:27
閱讀 2207·2023-01-20 08:28