vue中使用h5 video標(biāo)簽實(shí)現(xiàn)彈窗播放本地視頻的方法
參考h5 < video >標(biāo)簽的用法
在開發(fā)過程中主要涉及到以下幾個(gè)需要關(guān)注的點(diǎn)
1.彈窗的打開關(guān)閉
父組件中使用.sync綁定visible屬性,可直接在子組件中關(guān)閉彈窗更新父組件傳入的visible值;
// 父組件中引用子組件 <video-modal :visible.sync="showVideoModal"> // 子組件中 <el-dialog :visible="visible" @close="closeModal">
// 子組件中關(guān)閉彈窗方法 closeModal() { this.$emit("updata:visible", false); }
不過這樣使用會導(dǎo)致每次重新打開視頻彈窗進(jìn)度條都會留在上一次打開的位置,所以需要在引用子組件外再嵌套一個(gè)div,利用v-if使其每次打開都重新渲染,從而解決進(jìn)度條緩存的問題;
<div v-if="showVideoModal"> <video-modal :visible.sync="showVideoModal"> </div>
2. 本地視頻資源路徑的引入
需要播放的視頻是項(xiàng)目中的靜態(tài)資源,由于彈窗組件需要支持可復(fù)用,所以視頻路徑不可寫死,下面示例為視頻名稱自定義;
<video ref="video" class="play-video" controls="controls" autoplay="autoplay" > <source :src="require('@/assets/videos/' + videoName + '.mp4')" type="video/mp4" /> </video>
如果視頻不在src目錄下,而是public目錄下則寫法略有不同;
computed: { src() { // 需要在js部分用計(jì)算屬性定義 return process.env.BASE_URL + "videos/" + this.videoName + ".mp4"; } },
3. 視頻播放完畢自動關(guān)閉彈窗
監(jiān)聽video標(biāo)簽的ended事件并關(guān)閉彈窗即可,vue生命周期中定義需要增加this.$nextTick,否則無法獲取對應(yīng)的dom元素;
mounted() { this.$nextTick(() => { // 播放完畢自動關(guān)閉彈窗 const eleVideo = document.querySelector(".play-video"); eleVideo.addEventListener("ended", () => { this.closeVideoModal(); }, false); }); },
4. 視頻在彈窗中自適應(yīng)大小
給video標(biāo)簽設(shè)置合適的寬高,在利用object-fit: contain;屬性即可。
最后附上完整代碼
<template> <el-dialog class="video-dialog" :visible="visible" :title="title" width="75%" append-to-body @close="closeVideoModal"> <video ref="video" class="play-video" controls="controls" autoplay="autoplay" > <source :src="src" type="video/mp4" /> </video> </el-dialog> </template> <script> export default { name: "VideoModal", props: { visible: { type: Boolean, default: false }, // 父組件傳參彈窗標(biāo)題 title: { type: String, default: "" }, // 父組件傳參要播放的視頻名稱 videoName: { type: String, default: "" } }, computed: { src() { return process.env.BASE_URL + "videos/" + this.videoName + ".mp4"; } }, mounted() { this.$nextTick(() => { // 播放完畢自動關(guān)閉彈窗 const eleVideo = document.querySelector(".play-video"); eleVideo.addEventListener("ended", () => { this.closeVideoModal(); }, false); }); }, methods: { closeVideoModal() { this.$emit("update:visible", false); } } }; </script> <style lang="scss" scoped> .play-video { object-fit: contain; width: 100%; height: 99.5%; } </style>
到此這篇關(guān)于vue中使用h5 video標(biāo)簽實(shí)現(xiàn)彈窗播放本地視頻的方法的文章就介紹到這了,更多相關(guān)vue 彈窗播放本地視頻內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue視頻播放插件vue-video-player的具體使用方法
- vue使用video.js進(jìn)行視頻播放功能
- Vue結(jié)合Video.js播放m3u8視頻流的方法示例
- vue視頻播放暫停代碼
- vue-video-player視頻播放器使用配置詳解
- vue + typescript + video.js實(shí)現(xiàn) 流媒體播放 視頻監(jiān)控功能
- vue通過video.js解決m3u8視頻播放格式的方法
- vue-dplayer 視頻播放器實(shí)例代碼
- Vue使用video標(biāo)簽實(shí)現(xiàn)視頻播放
- vue+video.js實(shí)現(xiàn)視頻播放列表
相關(guān)文章
vue自定義插件封裝,實(shí)現(xiàn)簡易的elementUi的Message和MessageBox的示例
這篇文章主要介紹了vue自定義插件封裝,實(shí)現(xiàn)簡易的elementUi的Message和MessageBox的示例,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下2020-11-11Vue 電商后臺管理項(xiàng)目階段性總結(jié)(推薦)
這篇文章主要介紹了Vue 電商后臺管理項(xiàng)目階段性總結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Vue中Vue-Baidu-Map基本使用方法實(shí)例
最近有一個(gè)項(xiàng)目需要用到地圖來展示位置并進(jìn)行數(shù)據(jù)交互,用vue-baidu-map實(shí)現(xiàn)出來,下面這篇文章主要給大家介紹了關(guān)于Vue中Vue-Baidu-Map基本使用的相關(guān)資料,需要的朋友可以參考下2023-03-03一文詳解Pinia和Vuex與兩個(gè)Vue狀態(tài)管理模式
這篇文章主要介紹了一文詳解Pinia和Vuex與兩個(gè)Vue狀態(tài)管理模式,Pinia和Vuex一樣都是是vue的全局狀態(tài)管理器。其實(shí)Pinia就是Vuex5,只不過為了尊重原作者的貢獻(xiàn)就沿用了這個(gè)看起來很甜的名字Pinia2022-08-08Vue實(shí)現(xiàn)導(dǎo)出word文檔的示例詳解
這篇文章主要為大家詳細(xì)介紹了Vue如何使用第三方庫file-saver和html-docx-js實(shí)現(xiàn)導(dǎo)出word文檔的效果,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02Vue.js項(xiàng)目在IE11白屏報(bào)錯(cuò)的解決方法
本文主要介紹了Vue.js項(xiàng)目在IE11白屏報(bào)錯(cuò)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08