摘要:不顯示下載不顯示靜音不顯示音量條不顯示進度條只能播放一個不要快進按鈕例如父組件這樣回雪月花青春一點點語法大多數時候,我們希望頁面上播放一個音頻時,其他音頻可以暫停??梢园岩粋€類數組轉化成數組,這個是我常用的。
目的
本項目的目的是教你如何實現一個簡單的音樂播放器(這并不難)
本項目并不是一個可以用于生產環境的element播放器,所以并沒有考慮太多的兼容性問題
本項目不是ElementUI的一個音頻插件,只是一個教程,不過你可以自行擴展實現
本項目只是為了學習audio相關事件以及API
本項目的音頻文件是位于static/falling-star.mp3,歌曲名為:星球墜落Live 艾熱、李佳隆
查看在線demo: https://wangduanduan.github.i...
項目地址: https://github.com/wangduandu...
運行cd element-aduio && yarn && yarn run dev文檔 1. 簡介 1.1 相關技術
Vue
Vue-cli
ElementUI
yarn (之前我用npm, 并使用cnpm的源,但是用了yarn之后,我發現它比cnpm的速度還快,功能更好,我就毫不猶豫選擇yarn了)
Audio相關API和事件
1.2 從本教程你會學到什么?Vue單文件組件開發知識
Element UI基本用法
Audio原生API及Audio相關事件
音頻播放器的基本原理
音頻的播放暫停控制
音頻顯示時間
音頻進度條控制與跳轉
音頻音量控制
音頻播放速度控制
音頻靜音控制
音頻下載控制
個性化配置與排他性播放
一點點ES6語法
1.3 學前準備基本上不需要什么準備,但是如果你能先看一下Aduio相關API和事件將會更好
Audio: 如果你愿意一層一層剝開我的心
使用 HTML5 音頻和視頻
1.4 在線demo沒有在線demo的教程都是耍流氓
查看在線demon
項目地址
2 開始編碼 2.1 項目初始化? test vue init webpack element-audio A newer version of vue-cli is available. latest: 2.9.2 installed: 2.9.1 ? Project name element-audio ? Project description A Vue.js project ? Author wangdd? Vue build standalone ? Install vue-router? No ? Use ESLint to lint your code? No ? Set up unit tests No ? Setup e2e tests with Nightwatch? No ? Should we run `npm install` for you after the project has been created? (recommended) npm ? test cd element-audio ? element-audio npm run dev
瀏覽器打開 http://localhost:8080/, 看到如下界面,說明項目初始化成功
圖片1
2.2 安裝ElementUI并插入audio標簽 2.2.1 安裝ElementUIyarn add element-ui // or npm i element-ui -S2.2.2 在src/main.js中引入Element UI
// filename: src/main.js import Vue from "vue" import ElementUI from "element-ui" import App from "./App" import "element-ui/lib/theme-chalk/index.css" Vue.config.productionTip = false Vue.use(ElementUI) /* eslint-disable no-new */ new Vue({ el: "#app", template: "2.2.3 創建src/components/VueAudio.vue", components: { App } })
// filename: src/components/VueAudio.vue2.2.4 修改src/App.vue, 并引入VueAudio.vue組件
// filename: src/App.vue
打開:http://localhost:8080/,你應該能看到如下效果,說明引入成功,你可以點擊播放按鈕看看,音頻是否能夠播放
圖2
我們需要用一個按鈕去控制音頻的播放與暫停,這里調用了audio的兩個api,以及兩個事件
audio.play()
audio.pause()
play事件
pause事件
修改src/components/VueAudio.vue
// filename: src/components/VueAudio.vue{{audio.playing | transPlayPause}}
圖3 音頻播放與暫停
2.4 音頻顯示時間音頻的時間顯示主要有兩部分,音頻的總時長和當前播放時間??梢詮膬蓚€事件中獲取
loadedmetadata:代表音頻的元數據已經被加載完成,可以從中獲取音頻總時長
timeupdate: 當前播放位置作為正常播放的一部分而改變,或者以特別有趣的方式,例如不連續地改變,可以從該事件中獲取音頻的當前播放時間,該事件在播放過程中會不斷被觸發
要點代碼:整數格式化成時:分:秒
function realFormatSecond(second) { var secondType = typeof second if (secondType === "number" || secondType === "string") { second = parseInt(second) var hours = Math.floor(second / 3600) second = second - hours * 3600 var mimute = Math.floor(second / 60) second = second - mimute * 60 return hours + ":" + ("0" + mimute).slice(-2) + ":" + ("0" + second).slice(-2) } else { return "0:00:00" } }
要點代碼: 兩個事件的處理
// 當timeupdate事件大概每秒一次,用來更新音頻流的當前播放時間 onTimeupdate(res) { console.log("timeupdate") console.log(res) this.audio.currentTime = res.target.currentTime }, // 當加載語音流元數據完成后,會觸發該事件的回調函數 // 語音元數據主要是語音的長度之類的數據 onLoadedmetadata(res) { console.log("loadedmetadata") console.log(res) this.audio.maxTime = parseInt(res.target.duration) }
完整代碼
{{audio.playing | transPlayPause}} {{ audio.currentTime | formatSecond}} {{ audio.maxTime | formatSecond}}
打開瀏覽器可以看到,當音頻播放時,當前時間也在改變。
圖4
進度條主要有兩個控制,改變進度的原理是:改變audio.currentTime屬性值
音頻播放后,當前時間改變,進度條就要隨之改變
拖動進度條,可以改變音頻的當前時間
// 進度條ui2.6 音頻音量控制// 拖動進度條,改變當前時間,index是進度條改變時的回調函數的參數0-100之間,需要換算成實際時間 changeCurrentTime(index) { this.$refs.audio.currentTime = parseInt(index / 100 * this.audio.maxTime) }, // 當音頻當前時間改變后,進度條也要改變 onTimeupdate(res) { console.log("timeupdate") console.log(res) this.audio.currentTime = res.target.currentTime this.sliderTime = parseInt(this.audio.currentTime / this.audio.maxTime * 100) }, // 進度條格式化toolTip formatProcessToolTip(index = 0) { index = parseInt(this.audio.maxTime / 100 * index) return "進度條: " + realFormatSecond(index) },
音頻的音量控制和進度控制差不多,也是通過拖動滑動條,去修改aduio.volume屬性值,此處不再啰嗦
2.7 音頻播放速度控制音頻的音量控制和進度控制差不多,也是點擊按鈕,去修改aduio.playbackRate屬性值,該屬性代表音量的大小,取值范圍是0 - 1,用滑動條的時候,也是需要換算一下值,此處不再啰嗦
2.8 音頻靜音控制靜音的控制是點擊按鈕,去修改aduio.muted屬性,該屬性有兩個值: true(靜音),false(不靜音)。 注意,靜音的時候,音頻的進度條還是會繼續往前走的。
2.9 音頻下載控制音頻下載是一個a鏈接,記得加上download屬性,不然瀏覽器會在新標簽打開音頻,而不是下載音頻
下載2.10 個性化配置
音頻的個性化配置有很多,大家可以自己擴展,通過父組件傳遞響應的值,可以做到個性化設置。
controlList: { // 不顯示下載 noDownload: false, // 不顯示靜音 noMuted: false, // 不顯示音量條 noVolume: false, // 不顯示進度條 noProcess: false, // 只能播放一個 onlyOnePlaying: false, // 不要快進按鈕 noSpeed: false } setControlList () { let controlList = this.theControlList.split(" ") controlList.forEach((item) => { if(this.controlList[item] !== undefined){ this.controlList[item] = true } }) },
例如父組件這樣
2.11 一點點ES6語法
大多數時候,我們希望頁面上播放一個音頻時,其他音頻可以暫停。
[...audios]可以把一個類數組轉化成數組,這個是我常用的。
onPlay (res) { console.log(res) this.audio.playing = true this.audio.loading = false if(!this.controlList.onlyOnePlaying){ return } let target = res.target let audios = document.getElementsByTagName("audio"); // 如果設置了排他性,當前音頻播放是,其他音頻都要暫停 [...audios].forEach((item) => { if(item !== target){ item.pause() } }) },感謝
如果你需要一個小型的vue音樂播放器,你可以試試vue-aplayer, 該播放器不僅僅支持vue組件,非Vue的也支持,你可以看看他們的demo
參考文檔使用 JavaScript 實現簡單的拖拽
audio 相關API 以及事件
使用 HTML5 音頻和視頻
掃碼訂閱我的微信公眾號:洞香春天。每天一篇技術短文,讓知識不再高冷。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92186.html
摘要:手把手教你寫組件庫最近在研究的實現,發現網上很少有關于插件具體實現的文章,官方的文檔也只是一筆帶過,對于新手來說并不算友好。 手把手教你寫 Vue UI 組件庫 最近在研究 muse-ui 的實現,發現網上很少有關于 vue 插件具體實現的文章,官方的文檔也只是一筆帶過,對于新手來說并不算友好。 筆者結合官方文檔,與自己的摸索總結,以最簡單的 FlexBox 組件為例子,帶大家入門 v...
摘要:組件聲明組件分為全局的和局部的。父組件通過給子組件下發數據,子組件通過事件給父組件發送消息。以下實例中子組件已經和它外部完全解耦了。 1.vue 組件-聲明 組件分為全局的和局部的。 全局聲明 Vue.component(tagName, options) ** 引用組件 // 注冊 Vue.comp...
摘要:組件聲明組件分為全局的和局部的。父組件通過給子組件下發數據,子組件通過事件給父組件發送消息。以下實例中子組件已經和它外部完全解耦了。 1.vue 組件-聲明 組件分為全局的和局部的。 全局聲明 Vue.component(tagName, options) ** 引用組件 // 注冊 Vue.comp...
閱讀 3315·2021-11-12 10:36
閱讀 2467·2021-11-02 14:43
閱讀 2146·2019-08-30 14:23
閱讀 3462·2019-08-30 13:08
閱讀 919·2019-08-28 18:09
閱讀 3129·2019-08-26 12:22
閱讀 3141·2019-08-23 18:24
閱讀 2017·2019-08-23 18:17