做的一個簡單的半成品播放器
1、寫靜態(tài)頁面2、通過getMusicList函數(shù)用Ajax獲取歌曲數(shù)據(jù)列表musiclist3、通過loadMusic函數(shù)實現(xiàn)歌曲的播放功能4、根據(jù)獲取的歌曲數(shù)據(jù)來設(shè)置歌名、作者和背景圖片5、設(shè)置進度條隨歌曲進度而實時變更,通過給audio對象綁定ontimeupdate事件來實現(xiàn)6、設(shè)置歌曲時間隨歌曲進度而實時更新,通過給audio對象綁定ontimeupdate或者setimeInval來實現(xiàn)7、設(shè)置暫停鍵的功能8、設(shè)置下一首的功能9、設(shè)置上一首的功能10、設(shè)置歌曲播放完成后,自動播放下一首的功能11、設(shè)置點擊進度條切換歌曲進度的功能
currentIndex 歌曲的當前下標audio 當前歌曲對象MusicList 歌曲數(shù)據(jù)對象musicObj 當前歌曲對象 loadMusic函數(shù)傳遞的參數(shù)
創(chuàng)建或者獲取的audio對象,可通過以下兩種方式得到
方法1:
2、audioObject.play() 開始播放 3、audioObject.pause() 暫停播放 4、audioObject.autoPlay 設(shè)置或者獲取自動播放狀態(tài) audioObject.autoPlay = true //設(shè)置為自動播放,下次更換 audioObject.src 后會自動播放音樂audioObject.autoPlay = false //設(shè)置不自動播放console.log(audioObject.autoPlay) 5、audioObject.src 設(shè)置或者獲取音樂地址 audioObject.src = "http://cloud.hunger-valley.com/music/ifyou.mp3"console.log(audioObject.src) 6、audioObject.volume 設(shè)置或者獲取音量,最大值為1,0為靜音 audioObject.volume = 0.5audioObject.volume = 1console.log(audioObject.volume) 7、audioObject.loop 設(shè)置或者獲取循環(huán)狀態(tài) audioObject.loop = trueconsole.log(audioObject.loop) 8、audioObject.duration 獲取音樂長度,單位為秒 console.log(audioObject.duration) 9、 audioObject.currentTime 設(shè)置或者獲取播放時間 console.log(audioObject.currentTime) 10、 audioObject.ended 判斷音樂是否播放完畢,只讀屬性 11、audio.paused 表示音頻對象是否處于暫停狀態(tài),可以用來設(shè)置暫停鍵 四、前提知識(audio對象的事件) 1、playing 當音樂開始播放,暫停后重新開始播放,設(shè)置currentTime后開始播放時觸發(fā) audioObject.addEventListener("playing", function(){ console.log("playing")}) 2、pause 當音樂暫停時和結(jié)束時觸發(fā) audioObject.addEventListener("pause", function(){ console.log("pause")}) 3、ended 當音樂結(jié)束時觸發(fā) audioObject.addEventListener("ended", function(){ console.log("ended")}) 3、timeupdate 當currentTime更新時會觸發(fā)timeupdate事件,這個事件的觸發(fā)頻率由系統(tǒng)決定,但是會保證每秒觸發(fā)4-66次(前提是每次事件處理不會超過250ms. //如下代碼設(shè)置 每1秒左右執(zhí)行一次audioObject.shouldUpdate = trueaudioObject.ontimeupdate = function(){ var _this = this if(_this.shouldUpdate) { //do something console.log("update") _this.shouldUpdate = false setTimeout(function(){ _this.shouldUpdate = true }, 1000) }} 4、volumechange 當音量改變時觸發(fā) audioObject.onvolumechange = function(){ console.log("volumechange") } 五、遇到的坑 1、設(shè)置progress-now的寬度隨著播放時間變化而變化 我寫成的事這樣 audio.ontimeupdate=function(){ $(".progress-now").style.width=(this.currentTime/this.duration)*(getComputedStyle($(".bar")).width) } 實際上應該寫成百分比就可以了 audio.ontimeupdate=function(e){ $(".progress-now").style.width = (this.currentTime/this.duration)*100 + "%"} 2、兩種方式設(shè)置歌曲時間隨進度變化 1)設(shè)置ontimeupdate來設(shè)置,每秒觸發(fā)4-66次,時間變化不均勻 audio.ontimeupdate=function(e){ $(".progress-now").style.width = (this.currentTime/this.duration)*100 + "%" var min=Math.floor(this.currentTime/60) var sec= Math.floor(this.currentTime %60)>9?(Math.floor(this.currentTime%60)):("0"+Math.floor(this.currentTime%60)) $(".time").innerText=""+min+":"+sec } 2)通過setInterval來設(shè)置,每秒一次,時間變化均勻注意:這個函數(shù)不能寫成this.currentTime %60,不然輸出會變成NaN。要寫成audio.currentTime。我猜想應該是和set intervalthis的值會發(fā)生改變。之后填坑 audio.onplay=function(){ clock =setInterval(function(){ var min=Math.floor(audio.currentTime/60) var sec= Math.floor(audio.currentTime %60)>9?(Math.floor(audio.currentTime%60)):("0"+Math.floor(audio.currentTime%60)) $(".time").innerText=""+min+":"+sec }) } audio.onpause=function(){ clearInterval(clock) } 注意:不能寫成 var clock,clock必須是全局變量,沒辦法傳遞參數(shù)到clearInterval(clock),會報以下錯 3、做寬度相除,需要加上parseInt將字符串轉(zhuǎn)換成數(shù)值 不然輸出奇怪的數(shù)值 $(".musicbox .bar").onclick=function(e){ var percent=e.offsetX/ parseInt(getComputedStyle(this).width) audio.currentTime= audio.duration*percent //不要忘記了parseInt,把寬度轉(zhuǎn)換為數(shù)值 } 4、下一首的下標實現(xiàn)增加循環(huán) currentIndex = (++currentIndex)%MusicList.length 5、上一首的下標實現(xiàn)自減循環(huán) currentIndex = ((--currentIndex)+MusicList.length)%MusicList.length 6、GitHub不支持http協(xié)議 GitHub是https協(xié)議的,我在代碼里面寫了http協(xié)議,就報錯了,需要全部改成https。 7、需要把引入js文件的代碼放在最后,不然會報錯 Uncaught TypeError: Cannot set property "onclick" of null。原因是加載到onclick這個代碼的時候,發(fā)現(xiàn)dom結(jié)構(gòu)還沒有加載好,所以要把引入js文件的代碼放在html的最后 8、引入js文件的路徑錯誤 本地測試沒有問題,但是上傳github后出現(xiàn)了引入js錯誤,發(fā)現(xiàn)是路徑錯誤,需要加上./表示相對于當前的文件夾中的js和css 六、預覽鏈接 https://0612bamboo.github.io/...
開始播放
暫停播放
設(shè)置或者獲取自動播放狀態(tài)
audioObject.autoPlay = true //設(shè)置為自動播放,下次更換 audioObject.src 后會自動播放音樂audioObject.autoPlay = false //設(shè)置不自動播放console.log(audioObject.autoPlay)
設(shè)置或者獲取音樂地址
audioObject.src = "http://cloud.hunger-valley.com/music/ifyou.mp3"console.log(audioObject.src)
設(shè)置或者獲取音量,最大值為1,0為靜音
audioObject.volume = 0.5audioObject.volume = 1console.log(audioObject.volume)
設(shè)置或者獲取循環(huán)狀態(tài)
audioObject.loop = trueconsole.log(audioObject.loop)
獲取音樂長度,單位為秒
console.log(audioObject.duration)
設(shè)置或者獲取播放時間
console.log(audioObject.currentTime)
判斷音樂是否播放完畢,只讀屬性
表示音頻對象是否處于暫停狀態(tài),可以用來設(shè)置暫停鍵
當音樂開始播放,暫停后重新開始播放,設(shè)置currentTime后開始播放時觸發(fā)
audioObject.addEventListener("playing", function(){ console.log("playing")})
當音樂暫停時和結(jié)束時觸發(fā)
audioObject.addEventListener("pause", function(){ console.log("pause")})
當音樂結(jié)束時觸發(fā)
audioObject.addEventListener("ended", function(){ console.log("ended")})
當currentTime更新時會觸發(fā)timeupdate事件,這個事件的觸發(fā)頻率由系統(tǒng)決定,但是會保證每秒觸發(fā)4-66次(前提是每次事件處理不會超過250ms.
//如下代碼設(shè)置 每1秒左右執(zhí)行一次audioObject.shouldUpdate = trueaudioObject.ontimeupdate = function(){ var _this = this if(_this.shouldUpdate) {
//do something console.log("update") _this.shouldUpdate = false setTimeout(function(){ _this.shouldUpdate = true }, 1000)
}}
當音量改變時觸發(fā)
audioObject.onvolumechange = function(){ console.log("volumechange") }
我寫成的事這樣
audio.ontimeupdate=function(){ $(".progress-now").style.width=(this.currentTime/this.duration)*(getComputedStyle($(".bar")).width) }
實際上應該寫成百分比就可以了
audio.ontimeupdate=function(e){ $(".progress-now").style.width = (this.currentTime/this.duration)*100 + "%"}
1)設(shè)置ontimeupdate來設(shè)置,每秒觸發(fā)4-66次,時間變化不均勻
audio.ontimeupdate=function(e){ $(".progress-now").style.width = (this.currentTime/this.duration)*100 + "%" var min=Math.floor(this.currentTime/60) var sec= Math.floor(this.currentTime %60)>9?(Math.floor(this.currentTime%60)):("0"+Math.floor(this.currentTime%60)) $(".time").innerText=""+min+":"+sec }
2)通過setInterval來設(shè)置,每秒一次,時間變化均勻注意:這個函數(shù)不能寫成this.currentTime %60,不然輸出會變成NaN。要寫成audio.currentTime。我猜想應該是和set intervalthis的值會發(fā)生改變。之后填坑
audio.onplay=function(){ clock =setInterval(function(){ var min=Math.floor(audio.currentTime/60) var sec= Math.floor(audio.currentTime %60)>9?(Math.floor(audio.currentTime%60)):("0"+Math.floor(audio.currentTime%60)) $(".time").innerText=""+min+":"+sec }) } audio.onpause=function(){ clearInterval(clock) }
注意:不能寫成 var clock,clock必須是全局變量,沒辦法傳遞參數(shù)到clearInterval(clock),會報以下錯
不然輸出奇怪的數(shù)值
$(".musicbox .bar").onclick=function(e){ var percent=e.offsetX/ parseInt(getComputedStyle(this).width) audio.currentTime= audio.duration*percent //不要忘記了parseInt,把寬度轉(zhuǎn)換為數(shù)值 }
currentIndex = (++currentIndex)%MusicList.length
currentIndex = ((--currentIndex)+MusicList.length)%MusicList.length
GitHub是https協(xié)議的,我在代碼里面寫了http協(xié)議,就報錯了,需要全部改成https。
Uncaught TypeError: Cannot set property "onclick" of null。原因是加載到onclick這個代碼的時候,發(fā)現(xiàn)dom結(jié)構(gòu)還沒有加載好,所以要把引入js文件的代碼放在html的最后
本地測試沒有問題,但是上傳github后出現(xiàn)了引入js錯誤,發(fā)現(xiàn)是路徑錯誤,需要加上./表示相對于當前的文件夾中的js和css
https://0612bamboo.github.io/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/99865.html
摘要:高仿低配網(wǎng)頁版網(wǎng)易云音樂播放器前言沒有使用任何框架,只是想用最簡單純的代碼實現(xiàn)下前臺后臺是參考網(wǎng)上的例子寫的,代碼是在的基礎(chǔ)上重新寫的還有她的姊妹篇網(wǎng)易云音樂移動端,請查看這里寫在前頭的話鄙人野生前端一只,專業(yè),自學前端已經(jīng)一年多了 HTML+CSS+JAVASCRIPT 高仿低配網(wǎng)頁版網(wǎng)易云音樂播放器 showImg(https://segmentfault.com/img/remo...
閱讀 2913·2021-11-22 15:11
閱讀 3636·2021-09-28 09:43
閱讀 2961·2019-08-30 13:05
閱讀 3495·2019-08-30 11:18
閱讀 1510·2019-08-29 16:34
閱讀 1423·2019-08-29 13:53
閱讀 2993·2019-08-29 11:03
閱讀 1729·2019-08-29 10:57