摘要:前言最近在自學(xué)打算自己仿一個項目來實戰(zhàn)一下,由于本人很喜歡聽歌,所以就選擇了網(wǎng)易云音樂,在這與大家分享一下自己所遇到的問題,其中也有些不足之處也希望大家提一些寶貴的意見,互相學(xué)習(xí),一起進步。
前言
最近在自學(xué)vue,打算自己仿一個項目來實戰(zhàn)一下,由于本人很喜歡聽歌,所以就選擇了網(wǎng)易云音樂,在這與大家分享一下自己所遇到的問題,其中也有些不足之處也希望大家提一些寶貴的意見,互相學(xué)習(xí),一起進步。
關(guān)于項目使用的技術(shù)棧Vue:采用Vue的語法
Vuex:實現(xiàn)不同組件之間的狀態(tài)共享
vue-router:單頁應(yīng)用路由管理必備
axios:發(fā)起http請求
SASS(SCSS):css預(yù)處理語言
項目由于時間有限,只是做了個頁面的播放功能,其中用到了網(wǎng)易云音樂的API網(wǎng)易云,有興趣的可以去玩玩,其中也涉及到了一些知識點,在這與大家分享一下。
上圖整個效果:
)
這就是一個header組件,一個footer組件,一個musicList組件和一個paly組件組成的單頁面。
1. 如何獲取音樂的數(shù)據(jù)我這是從網(wǎng)易云音樂api扒出來的,扒出來之后新建一個文件,把數(shù)據(jù)放進去,之后通過axios獲取,部分代碼如下:
actions: { getData({ commit,state }) { if (localStorage.musics !== "[]" && localStorage.musics) { state.musicData = JSON.parse(localStorage.musics); return; } return new Promise((resolve, reject) => { Vue.axios.get("music-data") .then (res => { if (res.data.error === 0) { state.musicData = res.data.musicData; localStorage.musics = JSON.stringify(state.musicData); } }) .then(() => { commit("toggleMusic",0) }); resolve(); }); } }2. 刪除功能
我是在這刪除這個圖標(biāo)下綁定了一個事件,主要就二句代碼:
在methods定義del事件就好了 del(index){ this.$store.commit("del",index); }3. 尾部的播放控制
尾部的播放功能我一開始遇到了一個難題就是如何獲取歌曲的時間和控制播放的進度。后來通過查找資料和百度解決了
獲取歌曲時間的部分代碼如下:
{{transformTime(now)}}
js部分代碼
this.nativeAudio = document.querySelector("audio");
this.nativeAudio.addEventListener("play", () => {
this.totalTime = this.transformTime(this.nativeAudio.duration);
this.now = this.nativeAudio.currentTime;
setInterval(() => {
this.now = this.nativeAudio.currentTime;
}, 1000)
})
transformTime(seconds) {
let m, s;
m = Math.floor(seconds / 60);
m = m.toString().length == 1 ? ("0" + m) : m;
s = Math.floor(seconds - 60 * m);
s = s.toString().length == 1 ? ("0" + s) : s;
return m + ":" + s;
}
控制播放進度的部分代碼如下
changeTime(event) { let progressBar = this.$refs.progressBar; let coordStart = progressBar.getBoundingClientRect().left; //getBoundingClientRect()方法返回元素的大小及其相對于視口的位置 let coordEnd = event.pageX; this.nativeAudio.currentTime = (coordEnd - coordStart) / progressBar.offsetWidth * this.nativeAudio.duration; this.now = this.nativeAudio.currentTime; this.nativeAudio.play(); this.$store.commit("play", true); }, touchMove(event) { let progressBar = this.$refs.progressBar; let coordStart = progressBar.getBoundingClientRect().left; let coordEnd = event.touches[0].pageX; this.$refs.now.style.width = ((coordEnd - coordStart) / progressBar.offsetWidth).toFixed(3) * 100 + "%"; //toFixed(3)保留小數(shù)點后3位 }, touchEnd(event) { this.nativeAudio.currentTime = this.$refs.now.style.width.replace("%", "")/100 * this.nativeAudio.duration; this.now = this.nativeAudio.currentTime; this.nativeAudio.play(); this.$store.commit("play", true); },4. 換膚
換膚主要提供了四種顏色,紅色 藍色 黑色 和綠色,樣式使用的是flex布局,主要css代碼如下:
.skin { position: absolute; display: flex; flex-direction: column; bottom: 50px; right: 15px; width: 30px; .skin-colors { flex: 4; width: 100%; display: flex; justify-content: center; align-items: center; flex-direction: column; .selected { border: 1px solid white; } i { flex: 1; display: inline-block; width: 20px; height: 20px; cursor: pointer; border-radius: 10px; margin-bottom: 5px; } i.one { background-color: #B72712; } i.two { background-color: #1565C0; } i.three { background-color: #212121; } i.four { background-color: #1B5E20; } } .icon-skin { flex: 1; width: 100%; height: 30px; background-repeat: no-repeat; background-size: contain; margin-top: 3px; cursor: pointer; } .icon-skin-red { background-image: url("./skinRed.svg"); } .icon-skin-green { background-image: url("./skinGreen.svg"); } .icon-skin-blue { background-image: url("./skinBlue.svg"); } .icon-skin-black { background-image: url("./skinBlack.svg"); }5. 控制歌曲的上一首下一首的播放
部分代碼如下:
prev() { this.audio.index = this.audio.index === 0 ? this.musicData.length - 1 : (--this.audio.index); this.$store.commit("toggleMusic", this.audio.index); } next() { this.audio.index = this.audio.index === this.musicData.length - 1 ? 0 : (++this.audio.index); this.$store.commit("toggleMusic", this.audio.index); }
總結(jié):通過模仿這個項目更加清楚地了解各組件之前的使用和不同組件的狀態(tài)共享。當(dāng)然也遇到了一些坑,文章寫到這里,也沒有完全寫完,只寫了一個單頁面,但也算是一個小小的總結(jié),接下來附上我的源碼:項目源碼,有興趣的朋友可以看看順便幫忙點個star和fork,也希望能幫助到一些朋友。作為一名快要成為大四的學(xué)生,時間真的寶貴,對待學(xué)習(xí)也不敢懈怠,如果大家有什么好的想法的話可以聯(lián)系我的qq:137032979.碼字不容易,希望大家點個贊。前端路漫漫,與君共勉之。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96384.html
摘要:原型模式是創(chuàng)建模式的一種,其作用是提高創(chuàng)建效率,減少計算機資源開銷,與工廠模式類似的是,都屏蔽了對象實例化的過程概述原型模式是模式的一種,其特點就是通過克隆拷貝的方式來,節(jié)約創(chuàng)建成本和資源,被拷貝的對象模型就稱之為原型。 原型模式(Prototype Pattern)是創(chuàng)建模式的一種,其作用是提高創(chuàng)建效率,減少計算機資源開銷,與工廠模式類似的是,都屏蔽了對象實例化的過程... 概述 ...
摘要:目前只用到和音樂的輪播圖不用說,音樂這個網(wǎng)站的頁面我是真的挺喜歡,不光是他的設(shè)計,頁面的布局也很美觀,在控制臺調(diào)試的時候可以看看它的結(jié)構(gòu),非常有層次而富有美感,即使加上一層也不會有違和感。由于安全原因,跨域訪問是被各大瀏覽器所默認(rèn)禁止的。 一直想做一個vue項目 然后呢 我就做了 效果預(yù)覽 部分地方不全部根據(jù)原版,也有自由發(fā)揮的,目前功能模塊比較簡陋,如果加載太慢,可以下載下來再本地運...
摘要:行爬取頂點全網(wǎng)任意小說掘金之前連續(xù)多篇文章介紹客戶端爬取平臺,今天我們從零開始,實現(xiàn)爬取頂點小說網(wǎng)任意一本小說的功能。文件標(biāo)記所有文件我的后端書架后端掘金我的后端書架月前本書架主要針對后端開發(fā)與架構(gòu)。 30行js爬取頂點全網(wǎng)任意小說 - 掘金之前連續(xù)多篇文章介紹客戶端爬取平臺(dspider),今天我們從零開始,實現(xiàn)爬取頂點小說網(wǎng)任意一本小說的功能。 如果你還不知道客戶端爬取,可以先看...
摘要:行爬取頂點全網(wǎng)任意小說掘金之前連續(xù)多篇文章介紹客戶端爬取平臺,今天我們從零開始,實現(xiàn)爬取頂點小說網(wǎng)任意一本小說的功能。文件標(biāo)記所有文件我的后端書架后端掘金我的后端書架月前本書架主要針對后端開發(fā)與架構(gòu)。 30行js爬取頂點全網(wǎng)任意小說 - 掘金之前連續(xù)多篇文章介紹客戶端爬取平臺(dspider),今天我們從零開始,實現(xiàn)爬取頂點小說網(wǎng)任意一本小說的功能。 如果你還不知道客戶端爬取,可以先看...
摘要:引言兩個月前用全家桶實現(xiàn)過一次酷狗音樂,最近又用全家桶重構(gòu)了下,最終成果和的實現(xiàn)基本一致,放個圖手機預(yù)覽戳版本版本。的行為結(jié)構(gòu)表現(xiàn)分離,很明顯,而的分離雖然不是很明顯,但實際上也是有的。發(fā)送指令,最終會到里合并數(shù)據(jù),與中的類似。 引言 兩個月前用 Vue 全家桶實現(xiàn)過一次 酷狗音樂,最近又用 React 全家桶重構(gòu)了下,最終成果和 Vue的實現(xiàn)基本一致,放個圖: showImg(htt...
閱讀 1191·2023-04-26 02:38
閱讀 1483·2021-11-22 09:34
閱讀 1191·2021-09-26 10:19
閱讀 3180·2019-08-29 17:15
閱讀 3532·2019-08-29 12:27
閱讀 1722·2019-08-26 13:51
閱讀 1869·2019-08-26 13:47
閱讀 1020·2019-08-26 12:20