這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)使用vue怎么在頁(yè)面中實(shí)現(xiàn)一個(gè)音樂(lè)播放器,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)建站云計(jì)算的互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)13年的服務(wù)器租用、成都IDC機(jī)房托管、云服務(wù)器、網(wǎng)頁(yè)空間、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn),已先后獲得國(guó)家工業(yè)和信息化部頒發(fā)的互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)許可證。專(zhuān)業(yè)提供云主機(jī)、網(wǎng)頁(yè)空間、空間域名、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
用css做圖標(biāo)
.next { position: relative; display: inline-block; height: 36px; width: 36px; border: 2px solid #fff; border-radius: 20px; -webkit-border-radius: 20px; -moz-border-radius: 20px; } .next:before { content: ''; height: 0; width: 0; display: block; border: 10px transparent solid; border-right-width: 0; border-left-color: #fff; position: absolute; top: 8px; left: 10px; } .next:after { content: ''; height: 20px; width: 4px; display: block; background: #fff; position: absolute; top: 8px; left: 22px; }
畫(huà)一個(gè)唱片
網(wǎng)易云的唱片很好看,我也要弄一個(gè)唱片! 用好 box-shadow ,一個(gè)元素便可以做成很好看的唱片效果。
.disc { position: relative; margin-top: 10%; margin-left: 10%; width: 300px; height: 300px; border-radius: 300px; transform: rotate(45deg); background-image: radial-gradient(5em 30em ellipse, #fff, #000); border: 2px solid #131313; box-shadow: 0 0 0 10px #343935; opacity: 0.7; }
用range做進(jìn)度條
audio本身的樣式很難看,并且不同的瀏覽器呈現(xiàn)出來(lái)的效果也不一樣。當(dāng)然你可以修改audio的樣式,傳統(tǒng)的做法是通過(guò)controls屬性來(lái)隱藏audio,然后用div來(lái)代替。現(xiàn)在是html5時(shí)代了,當(dāng)然要用更符合場(chǎng)景的新元素————range。
input[type=range] { -webkit-appearance: none; width: 80%; height: 8px; border-radius: 10px; background-color: #fff; } input[type=range]::-webkit-slider-thumb{ -webkit-appearance: none; } input[type=range]::-webkit-slider-runnable-track { height: 8px; border-radius: 20px; } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; margin-top: -3px; height: 14px; width: 14px; background: #eb7470; border-radius: 50%; border: solid 3px #fff; box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.5); }
背景濾鏡模糊
將圖片設(shè)置為背景的感覺(jué)很棒,可以說(shuō)整個(gè)播放器的顏值這背景提供了一半。設(shè)置也非常簡(jiǎn)單,用到了css3的濾鏡。
.bg-blur { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: 100%; background-position: center; background-repeat: no-repeat; background-size: cover; filter: blur(20px); z-index: -1; }
背景圖片通過(guò)js控制。
<div class="bg-blur" :></div>
歌曲資源
爬下接口
直接去蝦米官網(wǎng)打開(kāi)network,將url復(fù)制到postman里面去做請(qǐng)求。通過(guò)修改headers發(fā)現(xiàn),會(huì)校驗(yàn)Referer。也就是說(shuō)只有蝦米允許的域名可以訪問(wèn)此接口。 http://api.xiami.com/web?v=2.0&app_key=1&key=aliez&page=1&limit=5&callback=jsonp154&r=search/songs
解決跨域問(wèn)題
因?yàn)榻涌谥С謏sonp。起初嘗試將chrome瀏覽器設(shè)置跨域,然后通過(guò)$.ajax去做一個(gè)jsonp的請(qǐng)求??梢哉TL問(wèn)。
之后突然不行了,是不是蝦米做了限制?
遂改用node啟動(dòng)一個(gè)服務(wù),去偽造referer發(fā)起請(qǐng)求,再將請(qǐng)求轉(zhuǎn)發(fā)到頁(yè)面。無(wú)意中寫(xiě)了一個(gè)代理。
... case '/song': let songOptions = { url: 'http://api.xiami.com/web?'+ urlArr[1], headers: { 'Referer': 'http://m.xiami.com/' } }; function callback1(error, response, body) { if (!error && response.statusCode == 200) { res.end(body); } } request(songOptions, callback1); break; ...
歌詞滾動(dòng)
作為一款逼格比較高的播放器,歌詞滾動(dòng)是必須的。
原理
將每一句歌詞保存為一個(gè)對(duì)象,有對(duì)應(yīng)的時(shí)間。當(dāng)歌曲播放的當(dāng)前時(shí)長(zhǎng)大于或等于歌詞的時(shí)間,小于此歌詞的下一句歌詞的時(shí)間,那么就將此歌詞滾動(dòng)到可視區(qū)域。并且修改字體顏色。
格式化歌詞
接口返回的歌詞一臉懵逼,仔細(xì)研究一下,發(fā)現(xiàn)是有規(guī)律的。
[ti:aLIEz] [ar:SawanoHiroyuki[nZk]:mizuki] [al:o1] [ly:澤野弘之] [mu:澤野弘之] [ma:] [pu:] [by:ttpod] [total:268512] [offset:0] [00:00.000]<195>aLIEz <199>- <451>SawanoHiroyuki[nZk]:mizuki [x-trans]徹頭徹尾的謊言 - SawanoHiroyuki[nZk]:mizuki [00:01.095]<201>作<250>詞<200>:<201>澤<200>野<199>弘<300>之 [x-trans] [00:02.846]<200>作<150>曲<150>:<200>澤<200>野<351>弘<349>之 [x-trans] [00:20.828]<200>決<250>め<200>つ<201>け<149>ば<201>か<349>り [x-trans]一直獨(dú)斷專(zhuān)權(quán) [00:23.279]<200>自<200>惚<200>れ<200>を<200>著<400>た [x-trans]總是自負(fù)逞強(qiáng) [00:24.979]<200>チ<200>ー<200>プ<450>な<550>hokori<350>で [x-trans]明明只是一文不值的驕傲 ...... refactoringLyrics(lyric){ let text = lyric.split('[offset:0]')[1]; let textArr = text.split('\n'); let lyricsArr = [], translate = []; textArr.forEach((item, index) => { let time = 0, text = ''; if (item.indexOf('[x-trans]') > -1) { translate.push(item.split('[x-trans]')[1]) } else if (item.trim() != '') { time = item.slice(1, 6).split(':'); time = parseInt(time[0]) * 60 + parseInt(time[1]); text = item.slice(11); let arr = text.split('>'); let str = arr.reduce((a, b) => { return a.split('<')[0] + b.split('<')[0] }); let obj = { time: time, text: str }; lyricsArr.push(obj); } }); for (let i in translate) { lyricsArr[i].text = lyricsArr[i].text + '\n' + translate[i]; } this.currentLyrics = lyricsArr; },
搜索欄實(shí)現(xiàn)
同文件下子組件掛載
為了遵循模塊化開(kāi)發(fā),決定將搜索欄寫(xiě)成一個(gè)子組件。在同一頁(yè)面下寫(xiě)子組件,子組件掛載到對(duì)應(yīng)的template就有講究了。此template不能被父組件的掛載元素包含,否則父組件渲染時(shí)會(huì)因?yàn)闊o(wú)法渲染子組件中的數(shù)據(jù)而報(bào)undefined。
<div id="app" class="main"> ... </div> <template id="search-box"> ... </template> var searchBox = { template: '#search-box', props: { isShow: Boolean, openFun: Function }, data(){ return { resultList: [], searchValue: '', } }, methods: { } }; new Vue({ el: '#app', components: { 'com-tip': tip, 'search-box': searchBox }, ... })
eventBus解決數(shù)據(jù)傳輸
通過(guò)jsonp去請(qǐng)求數(shù)據(jù),需要設(shè)置一個(gè)callback函數(shù),此callback寫(xiě)成一個(gè)全局函數(shù),如果不這樣寫(xiě),而是通過(guò) searchBox.methods.callback的形式,this指向?qū)閙ethods。而無(wú)法直接給searchBox的data賦值。 于是通過(guò)eventBus來(lái)處理,這樣更易維護(hù)。
var EventBus = new Vue(); var callBack = function(result) { console.log(result); EventBus.$emit('callBack', result); }; ... mounted(){ let self = this; EventBus.$on('callBack', function(res) { if (res && res.data) { self.resultList = res.data.songs; } }) } ...
localStrong儲(chǔ)存歌曲信息
下次再打開(kāi),應(yīng)該播放列表應(yīng)該保留上一次的數(shù)據(jù),這個(gè)可直接用localstrong實(shí)現(xiàn)
踩了坑
prop傳遞數(shù)據(jù)
使用cdn,vue的prop只支持中線格式,駝峰格式不生效
ps: 在用webpack打包的項(xiàng)目中用駝峰是可以,在打包過(guò)程中,會(huì)做處理。
// 正確寫(xiě)法 <search-box :is-show="showSearch" :open-fun="openSearch" @push-song="pushNewSong" @play-song="playSong"></search-box> // 錯(cuò)誤寫(xiě)法 <search-box :isShow="showSearch" :openFun="openSearch" @pushSong="pushNewSong" @playSong="playSong"></search-box>
上述就是小編為大家分享的使用vue怎么在頁(yè)面中實(shí)現(xiàn)一個(gè)音樂(lè)播放器了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章題目:使用vue怎么在頁(yè)面中實(shí)現(xiàn)一個(gè)音樂(lè)播放器
網(wǎng)頁(yè)路徑:http://jinyejixie.com/article8/gpssop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、網(wǎng)站策劃、網(wǎng)站收錄、商城網(wǎng)站、虛擬主機(jī)、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)