因为uniapp的video标签层级太高,所以我这边引用了原生的video标签

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

因为uniapp的video标签层级太高,所以我这边引用了原生的video标签 因为uniapp的video标签没有倍速功能而且层级太高只能够利用内置组件进行重写。

一、首先先封装一个组件

这个组件里面要写两个JS,前者是为了引用后者的,直接看完整代码吧!

二、完整代码

1.HTML

代码如下:

<template>
	<view v-html="videoHtml" id="dom-video" class="dom-video" :eventDrive="eventDrive"
		:change:eventDrive="domVideo.eventHandle" :videoSrc="videoSrc" :change:videoSrc="domVideo.srcChange"
		:videoProps="videoProps" :change:videoProps="domVideo.propsChange" :randomNum="randomNum"
		:change:randomNum="domVideo.randomNumChange" />
</template>

2.第一个js

因为是封装的组件所以要传值(第一个js):

<script>
	export default {
   
		props: {
   
			src: {
   
				type: String,
				default: ''
			},
			autoplay: {
   
				type: Boolean,
				default: false
			},
			loop: {
   
				type: Boolean,
				default: false
			},
			controls: {
   
				type: Boolean,
				default: false
			},
			objectFit: {
   
				type: String,
				default: 'contain'
			},
			muted: {
   
				type: Boolean,
				default: false
			},
			poster: {
   
				type: String,
				default: ''
			},
		},

		// 数据状态
		data() {
   
			return {
   
				videoHtml: '',
				videoSrc: '',
				eventDrive: null,
				videoProps: {
   },
				randomNum: Math.floor(Math.random() * 100000000 + 1)
			}
		},
		watch: {
   
			// 监听视频资源文件更新
			src: {
   
				handler(val) {
   
					if (!val) return
					this.initVideoHtml()
					setTimeout(() => {
   
						this.videoSrc = val
					}, 0)
				},
				immediate: true
			},
			// 监听首次加载
			autoplay: {
   
				handler(val) {
   
					this.videoProps.autoplay = val
				},
				immediate: true
			},
		},
		// 生命周期
		mounted() {
   
			this.initVideoHtml()
		},
		// 方法
		methods: {
   
			// 将video的事件传递给父组件
			videoEvent(data) {
   
				// console.log('向父组件传递事件 =>', data)
				this.$emit("videoEvent", data)
			},
			changePlaybackProgress(data) {
   
				this.$emit("changePlaybackProgress", data)

			},
			// 初始化视频
			initVideoHtml() {
   
				this.videoHtml = `<video
          src="${this.src}"
          id="dom-html-video_${this.randomNum}"
          class="dom-html-video"
          ${
   this.autoplay ? 'autoplay' : ''}
          ${
   this.loop ? 'loop' : ''}
          ${
   this.controls ? 'controls' : ''} 
          ${
   this.muted ? 'muted' : ''}
		  poster="${this.src}?x-oss-process=video/snapshot,t_0,f_jpg"
          preload="auto"
          playsinline
          webkit-playsinline
          width="100%"
          height="100%"
		  controlslist="nodownload"
          style="object-fit: ${this.objectFit};padding:0;"
		
        >
          <source src="${this.src}" type="video/mp4">
          <source src="${this.src}" type="video/ogg">
          <source src="${this.src}" type="video/webm">
        <
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值