JS實現音樂播放器介面
這次帶給大家JS實作音樂播放器介面,JS實作音樂播放器介面的注意事項有哪些,以下就是實戰案例,一起來看一下。
本文介紹了vue一個頁面實現音樂播放器的範例,分享給大家,具體如下:
效果如下:
專案網址:https://github.com/ermu592275254/MiniMusicPlayer
示範網址:https://ermu592275254.github.io/MiniMusicPlayer/(歌曲連結已失效)
開發前構思
介面
#做音樂播放器,介面一定要酷炫。太low了聽歌沒感覺。本身是為了上班的時候用,於是做成了類似網易雲音樂的介面,大小適中。不用相容手機端。
用css做圖示
本懷著簡單實用的需求去考慮,圖示可用SVG、url或css。相對於url,SVG和css更好。為了修煉,最終選擇的css。利用好after和before,能減少很多dom嵌套。
.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; }
畫一張唱片
網雲的唱片很好看,我也要弄一個唱片! 用好box-shadow ,一個元素便可以做成很好看的唱片效果。
.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做進度條
audio本身的樣式很難看,不同的瀏覽器呈現出來的效果也不一樣。當然你可以修改audio的樣式,傳統的做法是透過controls屬性來隱藏audio,然後用p來取代。現在是html5時代了,當然要用更符合場景的新元素————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); }
背景濾鏡模糊
將圖片設定為背景的感覺很棒,可以說整個播放器的顏值這背景提供了一半。設定也非常簡單,用到了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; }
背景圖片透過js控制。
<p class="bg-blur" :style="`background-image:url(${currentSong.album_logo})`"></p>
歌曲資源
爬下介面
直接去蝦米官網打開network,將url複製到postman裡面去做請求。透過修改headers發現,會校驗Referer。也就是說只有蝦米允許的網域名稱可以存取此介面。 http://api.xiami.com/web?v=2.0&app_key=1&key=aliez&page=1&limit=5&callback=jsonp154&r=search/songs
解決跨域問題
#解決跨域問題
因為介面支援jsonp。起初嘗試將chrome瀏覽器設定跨域,然後透過$.ajax去做一個jsonp的請求。可以正常存取。
之後突然不行了,是不是蝦米做了限制?遂改用node啟動一個服務,去偽造referer發起請求,再將請求轉發到頁面。無意中寫了一個代理。
... 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; ...
作為一款逼格比較高的播放器,歌詞滾動是必須的。
原理
將每一句歌詞保存為一個對象,有對應的時間。當歌曲播放的當前時長大於或等於歌詞的時間,小於此歌詞的下一句歌詞的時間,那麼就將此歌詞滾動到
可視區域。並修改字體顏色。
格式化歌詞#########介面回傳的歌詞一臉懵逼,仔細研究一下,發現是有規律的。 ###[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]一直独断专权 [00:23.279]<200>自<200>惚<200>れ<200>を<200>着<400>た [x-trans]总是自负逞强 [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; },
<p id="app" class="main"> ... </p> <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 }, ... })
通过jsonp去请求数据,需要设置一个callback函数,此callback写成一个全局函数,如果不这样写,而是通过 searchBox.methods.callback的形式,this指向将为methods。而无法直接给searchBox的data赋值。 于是通过eventBus来处理,这样更易维护。
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储存歌曲信息
下次再打开,应该播放列表应该保留上一次的数据,这个可直接用localstrong实现
踩了坑
prop传递数据
使用cdn,vue的prop只支持中线格式,驼峰格式不生效
ps: 在用webpack打包的项目中用驼峰是可以,在打包过程中,会做处理。
// 正确写法 <search-box :is-show="showSearch" :open-fun="openSearch" @push-song="pushNewSong" @play-song="playSong"></search-box> // 错误写法 <search-box :isShow="showSearch" :openFun="openSearch" @pushSong="pushNewSong" @playSong="playSong"></search-box>
待优化
手动修改进度,偶尔会不生效。
搜索暂不支持分页
不支持建歌单
背景颜色与进度条颜色相近需修改进度条颜色
不支持播放模式选择-单曲循环-随机播放
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是JS實現音樂播放器介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

從我記事開始,家裡就有一對落地式的大尺寸音響,讓我一直認為電視只有配上一套完整的音響系統才能稱得上是電視。但是剛開始工作的時候,我買不起專業的家庭音響。經過查詢、了解產品定位後,我發現回音壁這個品類非常適合我,不論是音質、體積或價格都符合我的需求。因此,我決定選擇回音壁。精挑細選後,我選了2024年初Bose推出了這款全景聲回音壁產品:Bose家庭娛樂揚聲器Ultra。 (圖片來源:雷科技攝製)一般來說,想要體驗到「原汁原味」的杜比全景聲效果,需要我們在家中佈置一套經過測量、校準的環繞聲+天花板

VLCChromecast功能在您的WindowsPC上不起作用嗎?此問題可能是由Chromecast設備與VLC的鑄造功能之間的兼容性問題引起的。在這篇文章中,我們將告訴你在這種情況下你可以做什麼,以及如果VLC渲染器找不到你的Chromecast該怎麼辦。如何在Windows上使用ChromecastVLC?要使用VLC將影片從Windows投射到Chromecast,請遵循以下步驟:打開媒體播放器應用程序,前往播放選單。導航到Renderer選項,您將能夠看到偵測到的Chromecast設

Audacity是一款免費開源的跨平台音訊編輯軟體。它具有開放的程式碼和插件貢獻機制,任何人都可以參與其中。此外,英特爾還提供了一套免費的OpenVINOAI插件,專為音樂編輯和播客製作人而設計。本站注意到,插件包大小約2GB,可在Intel的GitHub頁下載,還需要64位元Windows版Audacity才能運作。這款AI外掛最直覺的地方在於為Audacity音樂編輯功能帶來了三種進階工具:首先是「音樂生成」功能,使用者可以用文字描述所需音樂,AI會產生60秒以內的音樂片段,方便廣告和電影音樂

Windows10v1809十月更新版正朝著史上最糟糕Windows升級義無反顧地衝過去,不但第一次正式發布後緊急撤回,還在重新打造了一個月之久後仍然Bug層出不窮,讓人對微軟的品控越來越擔憂。現在,它的Bug清單上又多了一項,而且這次中招的是微軟自家的媒體播放器WindowsMediaPlayer。近期有網友回饋,在安裝最新修補程式後,Windows10v1809的WindowsMediaPlayer出現了無法拖曳播放進度條的問題。目前還沒有找到解決方法。微軟已確認了一個Bug,涉及兩個補丁KB4

音樂生用什麼平板合適華為的ipad中的12.9吋音響是一款非常好的產品。它配備了四個揚聲器,音效非常出色。而且,它屬於pro系列,相比其他款式稍微更好。整體來說,ipadpro是一款非常優秀的產品。這款mini4手機的喇叭聲音較小,效果一般般。不能用來外放音樂,還是需要依賴耳機來享受音樂。耳機音質好的會有稍微好一些的效果,而便宜的三四十元的耳機就無法滿足要求了。鋼琴電子譜用什麼平板如果您想購買一台10寸以上的iPad,我推薦使用兩款應用程序,分別是Henle和Piascore。 Henle提供

微信怎麼放音樂?微信APP中是可以播放自己喜愛的音樂,但是多數的小伙伴不知道微信中如何播放自己喜愛的音樂,接下來就是小編為用戶帶來的微信放音樂方法圖文教程,有興趣的用戶快來一起看看吧!微信使用教程微信怎麼放音樂1、先打開微信APP,從頂部向下滑動進入到小程式頁面;2、接著點擊如下圖箭頭所示的【音樂】;3、然後在如下圖的介面,搜尋框輸入喜愛的歌名;4、最後選擇對應歌名點選即可放歌曲。

汽水音樂本地音樂怎麼添加?汽水音樂APP中可以添加自己喜愛的本地音樂,但是多數的小伙伴不知道如何添加本地音樂,接下來就是小編為用戶帶來的汽水音樂本地音樂添加方法圖文教程,有興趣的用戶快來一起看看吧!汽水音樂使用教學汽水音樂本地音樂怎麼添加1、先打開汽水音樂APP,主頁最下方【音樂】功能專區點擊;2、之後進入到播放頁面,點擊右下角【三個點】圖標;3、最後下方展開功能欄,選擇其中【下載】按鈕即可新增至本機音樂。

隨著電腦的使用率越來越高,有時候可能會遇到Win10系統播放HEVC影片要收費的情況,遇到這種情況要如何處理呢?下面就跟小編一起來看看詳細內容吧。目前使用HEVC編碼的影片越來越多,在4K影片中特別常見,1080p影片為了提升畫質、減少體積也大量改用HEVC編碼,Win10影片播放器預設不支援HEVC,還是頗為影響使用的。缺乏HEVC編碼支持,除了影響視訊播放,甚至會影響圖片開啟。我們知道很多新手機例如iPhone都是用了HEIF格式來保存圖片,實際上HEIF圖片可以看作是HEVC視訊編碼的圖
