首頁 web前端 js教程 JS實現音樂播放器介面

JS實現音樂播放器介面

Mar 23, 2018 pm 04:36 PM
javascript 播放器 音樂

這次帶給大家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('<&#39;)[0] + b.split(&#39;<&#39;)[0]
      });
      let obj = {
        time: time,
        text: str
      };
      lyricsArr.push(obj);
    }
  });
  for (let i in translate) {
    lyricsArr[i].text = lyricsArr[i].text + &#39;\n&#39; + translate[i];
  }
  this.currentLyrics = lyricsArr;
},
登入後複製
######搜尋列實作############同檔下子元件掛載#########為了遵循模組化開發,決定將搜尋欄寫成一個子組件。在同一頁面下寫子組件,子組件掛載到對應的template就有講究了。此template不能被父元件的掛載元素包含,否則父元件渲染時會因為無法渲染子元件中的資料而報undefined。 ###
<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
  },
  ...
})
登入後複製
######eventBus解決資料傳輸#######

通过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中文网其它相关文章!

推荐阅读:

Express与Koa2的使用详解

地图网格的实现

以上是JS實現音樂播放器介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1668
14
CakePHP 教程
1427
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
Bose Soundbar Ultra首發體驗:開箱即用的家庭劇院? Bose Soundbar Ultra首發體驗:開箱即用的家庭劇院? Feb 06, 2024 pm 05:30 PM

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

VLC Chromecast無法在Windows PC上執行 VLC Chromecast無法在Windows PC上執行 Mar 26, 2024 am 10:41 AM

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

透過英特爾 OpenVINO 插件,Audacity 現已獲得 AI 音訊編輯功能 透過英特爾 OpenVINO 插件,Audacity 現已獲得 AI 音訊編輯功能 Feb 15, 2024 am 11:06 AM

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

win10播放器進度條不動 win10播放器進度條不動 Feb 12, 2024 am 08:12 AM

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

選擇適合音樂生的平板電腦 選擇適合音樂生的平板電腦 Jan 10, 2024 pm 10:09 PM

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

微信怎麼放音樂 微信怎麼放音樂 Feb 23, 2024 pm 09:28 PM

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

汽水音樂本地音樂怎麼添加 汽水音樂本地音樂怎麼添加 Feb 23, 2024 pm 07:13 PM

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

Win10自帶播放器HEVC視訊擴充功能需付費如何解決? Win10自帶播放器HEVC視訊擴充功能需付費如何解決? Feb 09, 2024 pm 02:54 PM

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

See all articles