基于JavaScript實(shí)現(xiàn)一個(gè)月餅音樂播放器
前言
事情的經(jīng)過是這樣的,媳婦中秋發(fā)了一盒月餅,里面還有一個(gè)小藍(lán)牙音響,她說如果這個(gè)音響是個(gè)月餅造型之類的是不是更能體現(xiàn)出中秋的氣氛。于是我就想到了可以用代碼給她實(shí)現(xiàn)一個(gè)啊,拿出了我僅有的一點(diǎn)點(diǎn)前端看家本領(lǐng)(我是搞后端的),浪費(fèi)我三天假期,效果圖如下,本來設(shè)想的挺好,可是由于本人能力有限,沒有達(dá)到自己預(yù)想的目標(biāo),僅供娛樂!
頁面布局
頁面采用最簡(jiǎn)單的div+css進(jìn)行布局,首先將頁面分為三部分,分別為左邊音樂列表,中間播放器部分和右邊歌詞部分。
頁面背景
可以選擇一張比較好看的照片作為頁面背景,我就隨便選了一張中秋主題相關(guān)的作為背景,下一步準(zhǔn)備做一個(gè)設(shè)置功能可以自定義頁面背景。
<div id="back_box" style="background-image: url('http://121.196.234.193/test/images/background.jpeg');"></div>
左側(cè)列表
列表調(diào)用后端接口動(dòng)態(tài)加載數(shù)據(jù),后端接口采用php實(shí)現(xiàn)。
<div class="music_con"> <div class="m_search"> <input type="text" class="word search-word" placeholder="搜索"><input type="image" src="http://121.196.234.193/test/images/search.png" class="search-btn" placeholder=""> </div> <ul id="lists"> </ul> </div>
js實(shí)現(xiàn)部分如下:
ajax('GET', mp3Url, '', function(data){ musicList = JSON.parse(data); str = ''; for (var i =0, l= musicList.length; i<l; i++) { if (i==0) { str+='<li class="default">' } else { str +='<li>' } str += '<a href="./index.html" rel="external nofollow" >' + '<label>'+musicList[i].title+'</label>' + '<i> - </i>' + '<span>'+musicList[i].singer+'</span>' + '</a>' + '</li>'; } document.getElementById('lists').innerHTML= str })
中間播放器
這部分也是核心。
首先設(shè)置一個(gè)背景,本來想自己用代碼畫一個(gè)月餅的,結(jié)果超出了我的能力范圍,于是從網(wǎng)上找一張圖片,這個(gè)月餅是不是看著看誘人,其實(shí)這個(gè)地方可以根據(jù)音樂設(shè)定不同的背景,通過接口返回,在這里就先這樣吧。
給圖片加點(diǎn)特效——讓它轉(zhuǎn)起來。
<div class="PlayEy" style="transform: rotate(0deg);"></div>
在CSS3中transform主要包括以下幾種:旋轉(zhuǎn)rotate、扭曲skew、縮放scale和移動(dòng)translate以及矩陣變形matrix。
rotate() :通過指定的角度參數(shù)對(duì)原元素指定一個(gè)2D rotation(2D 旋轉(zhuǎn)),需先有transform-origin屬性的定義。transform-origin定義的是旋轉(zhuǎn)的基點(diǎn),其中angle是指旋轉(zhuǎn)角度,如果設(shè)置的值為正數(shù)表示順時(shí)針旋轉(zhuǎn),如果設(shè)置的值為負(fù)數(shù),則表示逆時(shí)針旋轉(zhuǎn)。如:transform:rotate(30deg);
音樂播放采用audio標(biāo)簽。
<div class="btns-bg"> <div class="PlayEy" style="transform: rotate(0deg);"></div> <div class="Btn"></div> <div class="Play" id="btn_play" item="1" style="background-image: url('http://121.196.234.193/test/images/pause.png'); width: 29px; height: 36px;"> <audio src="http://121.196.234.193/test/music/1.mp3" id="audio_box" data-id="1"></audio> </div> <!--按鈕(暫停/播放、上一曲、下一曲、聲音開關(guān)、音量調(diào)節(jié)、循環(huán)播放)--> <div id="btn_prev"></div> <div id="btn_next"></div> <div id="volume_toggle" item="1" style="background-position: -152px 0px;"></div> <div class="volume_box"> <input id="volume_change" type="range" min="1" max="10" value="5" style="background:linear-gradient(to right, #059CFA, #ebeff4 50%, #ebeff4)"> </div> <div id="loop_type" item="1" style="background-position: -105px -58px;"></div> <!--音頻時(shí)間--> <div class="time_box"> <span id="now_time">00:00</span> <span id="total_time">00:22</span> </div> <!--音頻播放進(jìn)度條--> <div class="time_axis"> <div class="slideway"> <p id="progress_bar"></p> <div id="ahead_head"></div> </div> </div> </div>
audio相關(guān)屬性:
- autoplay:自動(dòng)播放(一般瀏覽器會(huì)禁止此行為)。
- controls:顯示音頻控件。
- loop:循環(huán)播放。
- muted:靜音。
- preload:加載方式,分auto(當(dāng)頁面加載后載入整個(gè)音頻)、metadata(當(dāng)頁面加載后只載入元數(shù)據(jù))、none(當(dāng)頁面加載后不載入音頻)。
- src:音頻地址。
js實(shí)現(xiàn)
// 啟動(dòng)播放方法 function plays(){ //_audioDom.load(); let playPromise = _audioDom.play() ; if (playPromise !== undefined) { playPromise.then(() => { _audioDom.play() }).catch(() => {}) } }
右側(cè)歌詞部分
主要用于展示當(dāng)前播放音樂的標(biāo)題和歌詞信息,數(shù)據(jù)采用js動(dòng)態(tài)加載。
<!--音頻標(biāo)題--> <div class="title_box"> <span id="music_title">你笑起來真好看</span> </div> <!--歌詞區(qū)域--> <div id="music_lyric"> <span class="lyric_prev"></span> <span class="lyric_now"></span> <span class="lyric_next"></span> </div>
js部分實(shí)現(xiàn):
/** 當(dāng)前播放時(shí)間發(fā)生改變的時(shí)候 **/ _audioDom.ontimeupdate = function(){ _totalTime.innerHTML = timeFormat(_audioDom.duration); // 音頻總時(shí)間; _nowTime.innerHTML = timeFormat(_audioDom.currentTime); // 更新當(dāng)前播放的時(shí)間; var now_long = _audioDom.currentTime/_audioDom.duration*slidewayWidth; // 當(dāng)前時(shí)間播放的長(zhǎng)度 _progress.style.width = now_long+'px'; // 進(jìn)度條長(zhǎng)度 _aheadDom.style.left = (now_long-10)+'px'; // 進(jìn)度條頭位置 //遍歷歌詞 for (var i = 0, l = lyricArr.length; i < l; i++) { if (_audioDom.currentTime > lyricArr[i][0]) { if(i>=1){ _lyricPrev.innerHTML = lyricArr[i-1][1]; _lyricNow.innerHTML = lyricArr[i][1]; if(lyricArr.hasOwnProperty(i+1)){ _lyricNext.innerHTML = lyricArr[i+1][1]; }else { _lyricNext.innerHTML = ''; } }else{ _lyricPrev.innerHTML = ''; _lyricNow.innerHTML = lyricArr[i][1]; _lyricNext.innerHTML = lyricArr[i+1][1]; } } } addListenTouch(); // 監(jiān)聽手動(dòng)拉動(dòng)播放進(jìn)度條 };
總結(jié)
雖然大體效果出來了,但是跟預(yù)想的還是有很大差距,因?yàn)椴皇菍I(yè)的前端,整體實(shí)現(xiàn)比較簡(jiǎn)單,只能做到這了,僅供娛樂!
到此這篇關(guān)于基于JavaScript實(shí)現(xiàn)一個(gè)月餅音樂播放器的文章就介紹到這了,更多相關(guān)JavaScript音樂播放器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入淺析ES6 Class 中的 super 關(guān)鍵字
本文給大家收藏整理了ES6 Class 中的 super 關(guān)鍵字,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-10-10js 遞歸json樹實(shí)現(xiàn)根據(jù)子id查父id的方法分析
這篇文章主要介紹了js 遞歸json樹實(shí)現(xiàn)根據(jù)子id查父id的方法,結(jié)合實(shí)例形式分析了JavaScript遞歸遍歷json進(jìn)行數(shù)據(jù)查詢的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11js中toString()和String()區(qū)別詳解
本文主要介紹了js中toSring()和Sring()的區(qū)別。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03JavaScript定義函數(shù)的三種實(shí)現(xiàn)方法
這篇文章主要介紹了JavaScript定義函數(shù)的三種實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文大家能夠掌握三種定義函數(shù)的方法,需要的朋友可以參考下2017-09-09electron的webview和內(nèi)嵌網(wǎng)頁通信的方法
在 Electron 的世界里,webview 標(biāo)簽相當(dāng)于一個(gè)小盒子,里面可以裝一個(gè)完整的網(wǎng)頁,就像一個(gè)迷你瀏覽器,這篇文章主要介紹了electron的webview和內(nèi)嵌網(wǎng)頁如何通信,需要的朋友可以參考下2024-04-04原生javascript實(shí)現(xiàn)圖片輪播效果代碼
前幾天用jquery做了一個(gè)JS的圖片輪播效果,現(xiàn)在用原生的javascript代碼實(shí)現(xiàn)同樣的功能,當(dāng)練習(xí)用吧,代碼寫得不是很滿意。2010-09-09javascript:json數(shù)據(jù)的頁面綁定示例代碼
本篇文章主要是對(duì)javascript:json數(shù)據(jù)的頁面綁定示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01