vue中使用h5 video标签实现弹窗播放本地视频

本文介绍了在Vue项目中使用HTML5 video标签实现弹窗播放本地视频的方法,包括弹窗的打开关闭、本地视频资源路径的引入、视频播放完毕自动关闭弹窗以及视频在弹窗中的自适应大小调整。通过监听video的ended事件和合理设置样式,实现了视频播放的完整功能。
部署运行你感兴趣的模型镜像

参考h5 < video >标签的用法

在开发过程中主要涉及到以下几个需要关注的点

1.弹窗的打开关闭

父组件中使用.sync绑定visible属性,可直接在子组件中关闭弹窗更新父组件传入的visible值;

// 父组件中引用子组件
<video-modal :visible.sync="showVideoModal">

// 子组件中
<el-dialog :visible="visible" @close="closeModal"> 
// 子组件中关闭弹窗方法
closeModal() {
    this.$emit("updata:visible", false);
} 

不过这样使用会导致每次重新打开视频弹窗进度条都会留在上一次打开的位置,所以需要在引用子组件外再嵌套一个div,利用v-if使其每次打开都重新渲染,从而解决进度条缓存的问题;

<div v-if="showVideoModal">
    <video-modal :visible.sync="showVideoModal">
</div> 
2. 本地视频资源路径的引入

需要播放的视频是项目中的静态资源,由于弹窗组件需要支持可复用,所以视频路径不可写死,下面示例为视频名称自定义;

<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部分用计算属性定义
        return process.env.BASE_URL + "videos/" + this.videoName + ".mp4";
    }
}, 
3. 视频播放完毕自动关闭弹窗

监听video标签的ended事件并关闭弹窗即可,vue生命周期中定义需要增加this.$nextTick,否则无法获取对应的dom元素;

mounted() {
    this.$nextTick(() => {
        // 播放完毕自动关闭弹窗
        const eleVideo = document.querySelector(".play-video");
        eleVideo.addEventListener("ended", () => {
            this.closeVideoModal();
        }, false);
    });
}, 
4. 视频在弹窗中自适应大小

给video标签设置合适的宽高,在利用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
        },
        // 父组件传参弹窗标题
        title: {
            type: String,
            default: ""
        },
        // 父组件传参要播放的视频名称
        videoName: {
            type: String,
            default: ""
        }
    },
    computed: {
        src() {
            return process.env.BASE_URL + "videos/" + this.videoName + ".mp4";
        }
    },
    mounted() {
        this.$nextTick(() => {
            // 播放完毕自动关闭弹窗
            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> 

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

### 解决方案概述 在解决 UniApp 中 `video` 组件无法播放视频的问题时,可以参考多种方法。以下是几种常见的解决方案及其适用场景。 --- ### 方法一:使用 `v-html` 动态生成视频标签 通过 `v-html` 动态生成 `<video>` 标签,并结合 `uni-popup` 弹窗组件实现视频播放功能[^3]。这种方式适用于需要动态加载视频 URL 的场景。 ```vue <template> <uni-popup class="videoPop" type="center" ref="videoPop"> <view style="width: 100%;height: 100%;text-align: center;" v-html="videoHTML"></view> </uni-popup> </template> <script> export default { data() { return { videoUrl: "https://example.com/video.mp4", // 视频地址 videoHTML: "" }; }, methods: { openVideoPopup() { this.$refs.videoPop.open(); this.videoHTML = ` <video class="video-box" src="${this.videoUrl}" autoplay="false" play-strategy="3" controls style="width:100%;height:100%" ></video> `; } } }; </script> ``` --- ### 方法二:使用 `web-view` 组件 对于复杂场景或需要兼容更多平台的情况,可以使用 `web-view` 组件加载外部页面或嵌入 HTML5 视频播放器[^3]。此方法适用于需要更高兼容性的场景。 ```vue <template> <web-view :src="videoSrc"></web-view> </template> <script> export default { data() { return { videoSrc: "https://example.com/video.html" // 外部视频页面地址 }; } }; </script> ``` --- ### 方法三:利用 `iframe` 实现自定义组件 通过创建一个自定义的 `nVideo.vue` 组件,使用 `iframe` 嵌入视频播放器,解决层级问题和跨平台兼容性问题[^2]。这种方法简单粗暴,适合快速实现需求。 #### 自定义组件代码示例 ```vue <!-- nVideo.vue --> <template> <iframe :src="videoSrc" frameborder="0" allowfullscreen style="width:100%;height:100%;" ></iframe> </template> <script> export default { props: { src: { type: String, required: true } }, computed: { videoSrc() { return this.src; } } }; </script> ``` #### 使用示例 ```vue <template> <n-video :src="videoUrl"></n-video> </template> <script> import nVideo from "./components/nVideo.vue"; export default { components: { nVideo }, data() { return { videoUrl: "https://example.com/video.mp4" }; } }; </script> ``` --- ### 方法四:调整浏览器行为与参数设置 某些情况下,浏览器会劫持 `<video>` 标签使用系统自带播放器,导致无法正常覆盖弹幕或弹窗操作[^1]。可以通过以下方式尝试解决: - 确保视频格式支持当前平台(如 MP4、WebM)。 - 添加 `playsinline` 属性以避免全屏播放: ```html <video playsinline></video> ``` - 检查是否需要设置 `x5-video-player-type` 和 `x5-video-player-fullscreen` 参数(适用于部分安卓浏览器): ```html <video x5-video-player-type="h5" x5-video-player-fullscreen="true"></video> ``` --- ### 注意事项 1. **真机测试**:某些问题仅在真机环境中出现,需确保在目标设备上进行充分测试。 2. **平台差异**:不同平台(H5、Android、iOS)可能存在不同的兼容性问题,建议分别测试并选择合适的解决方案。 3. **性能优化**:如果视频文件较大,考虑使用流式播放技术(如 HLS)替代直接下载播放。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值