uniAPP 视频图片预览组件

效果图

 

思路:处理文件列表,根据文件类型归类


已兼容 H5  ios 设备,测试已通过 浙政钉,微信小程序
视频资源因为,没有预览图,用灰色图层加播放按钮代替

<template>
	<!--视频图片预览组件 -->
	<view v-if="list.length">
		<view class="back-medio">
			
			<view v-if="imgList.length" class="img-box" v-for="(item,index) in imgList" :key="index">
				<img :src="item.filepath" class="step-img" @click="viweImage(item.filepath)" />
				<view class="img-num" v-if="index == '0'">
					{{ list.length }}张
				</view>
			</view>
			<view v-if="videoList.length" v-for="(item,id) in videoList" :key="id+'d'" class="img-box"
				@click="playvideo(item)">
				<view class="step-img vide-back">
					<img :src="playIcon" class="playIcon" />
				</view>
			</view>
			</view>
		</view>
		<!-- 视频预览 兼容H5-->
		<uni-popup ref="videoShow" :mask-click="false">
<view class="viewVideo">
				<!-- 兼容H5 -->
				<view class="close" @click="fullscreenchange"></view>
				<video id="myVideo" :src="cVideo" object-fit='contain' autoplay="false" :controls="true"
show-fullscreen-btn="false" play-btn-position="center" show-loading='true'
					@fullscreenchange="fullscreenchange"></video>
			</view>
		</uni-popup>
	</view>
</template>
<script>

	export default {
		props: {
			list: {
				type: [Array,Object],
				default:[],
                // 示例数据
				// {
				//     "createTime": "2023-07-04 02:34:15",
				//     "modifyTime": "2023-07-04 02:34:15",
				//     "id": 4086,
				//     "filepath": "https://wsgz.deqing.gov.cn/images/4/20230704103415Dingtalk_20230526111858.jpg",
				//     "filename": "20230704103415Dingtalk_2023052
                // }
},
		},
		created() {
			this.init('1')
		},
		watch: {
			list() {
				this.init('1')
				console.log("ls",this.list)
			}
		},
data() {
			return {
				videoList: [], //媒体文件列表
				imgList: [], //媒体文件列表
				cVideo: '', //当前播放视频
				// 图标
				playIcon: 替换成播放图标bese64代码,
}
		},
		methods: {
			// 关闭视频弹窗
			close() {
				this.$refs.videoShow.close()
			},
// 点击视频封面预览视频
			playvideo(item) {
				console.log("播放", item)
				this.cVideo = item.filepath
				this.$refs.videoShow.open('top')
				this.videoContext = uni.createVideoContext('myVideo', this);
				// this.videoContext.requestFullScreen({
				// 	direction: 0
				// });
				this.videoContext.play()
			},
			// 视频0 满屏点击关闭
			fullscreenchange() {
				this.cVideo = ''
				this.videoContext.pause()
				this.close()
			},
            // 预览图片单张
			viweImage(e) {
				console.log(" 预览图片单张", e)
				uni.previewImage({
					current: 0,
					urls: [e]
				});
			},
            // 预览图片单张
			viweImage(e) {
				console.log(" 预览图片单张", e)
				uni.previewImage({
					current: 0,
					urls: [e]
				});
			},
init(bu) {
				console.log("dfsfsfss", bu, this.list,this.list.constructor)
				let th = this
				let arr =th.list
				th.videoList = []
				th.imgList = []
				arr.length && arr.forEach((item) => {
					// if (item.imgPath) {
					let type = item.fileExtName
					if (type == "mp4" || type == "rmvb" || type == "avi" || type == "ts") {
						th.videoList.push(item)
					} else {
						th.imgList.push(item)
					}
})
				// console.log("处理:", this.videoList, this.imgList)
			}
		}
}
</script>

<style lang="scss">
	.dynamic-img {
		margin-top: 20rpx;
		display: flex;
		flex-wrap: wrap;
		height: 120rpx;
		overflow: hidden;
image {
			height: 120rpx;
			width: 120rpx;
			margin-right: 16rpx;
		}

		.video-box {
			height: 120rpx;
			width: 120rpx;
			margin-right: 16rpx;
			position: relative;

			.triangle {
display: inline-block;
				font-size: 0;
				overflow: hidden;
				z-index: 2;
				top: 50rpx;
				right: 50rpx;
			}

			.triangle:before {
				content: "";
				position: relative;
				display: inline-block;
				border: 25rpx solid transparent;
			}
.triangle-right {
				position: absolute;
				right: 35rpx;
				top: 36rpx;
				border-top-right-radius: 50%;
				border-bottom-right-radius: 50%;
			}

			.triangle-right:before {
				left: 2px;
				border-right-width: 0;
				border-left-width: 50rpx;
				border-left-color: rgb(181, 181, 181);
			}

			.black {
				z-index: 1;
				position: absolute;
				top: 0;
				left: 0;
				height: 120rpx;
				width: 120rpx;
				background: #000000;
				opacity: 0.4;
			}
.video {
				position: absolute;
				top: 0;
			}
		}
	}

	.viewVideo {
        width: 100vw;
		min-height: 100vh;
		display: -webkit-box;
		display: -webkit-flex;
		display: flex;
		align-items: flex-start;
		justify-content: center;
		background: #000000;
		flex-wrap: wrap;
.close {
			width: 80rpx;
			height: 80rpx;
			z-index: 99999;
			position: relative;
			margin: 0 auto;
			top: 60rpx;
		}

		.close:before,
.close:after {
			position: absolute;
			left: 40rpx;
			content: ' ';
			height: 80rpx;
			width: 8rpx;
			background-color: #EFEFF4;
		}

		.close:before {
			transform: rotate(45deg);
		}

		.close:after {
			transform: rotate(-45deg);
		}
	}
#myVideo {
		width: 100vw;
		height: 80vh;
		margin: 20px 0;
	}
	.back-medio {
		display: flex;
		flex-wrap: wrap;
		height: 48.4px;
		overflow: hidden;

		.vide-back {
			background: #3a3939c4;
		}
.img-box {
			position: relative;
			width: 62.23px;
			height: 48.4px;
			margin-right: 8px;
			margin-bottom: 8px;
			overflow: hidden;
			.step-img {
				width: 62.23px;
				height: 48.4px;
				border-radius: 4px;
			}
.playIcon {
				width: 30px;
				height: 30px;
				margin: 9px 16px;
			}

			.img-num {
				position: absolute;
				top: 0;
				right: 0;
				height: 32rpx;
				line-height: 32rpx;
                padding: 0 10rpx;
				font-size: 20rpx;
				z-index: 8;
				color: #ffffff;
				background: rgba(0, 20, 54, 0.6);
				border-radius: 0px 20rpx;
			}
		}
	}
.video-box {
		width: 62.23px;
		height: 48.4px;

		.video::-webkit-media-controls {

			display: none !important
		}

	}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/48469.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Consul的容器服务更新与发现

Consul的容器服务更新与发现 一&#xff1a;Docker consul的容器服务更新与发现&#xff08;1&#xff09;什么是服务注册与发现&#xff08;2&#xff09;什么是consulconsul提供的一些关键特性&#xff1a; 二&#xff1a;consul 部署consul服务器1. 建立 Consul 服务2. 查看…

quartus工具篇——ROM ip核

quartus工具篇——ROM ip核 1、ROM简介 FPGA中的ROM(Read-Only Memory)是一种只读存储器,主要用来存储固化的初始化配置数据。FPGA ROM的特性主要有: 预编程初始化 - ROM在FPGA编程时就已经写入了初始值,这些值在整个工作周期保持不变。初始化配置 - ROM通常用来存储FPGA的初…

【图论】三种中心性 —— 特征向量、katz 和 PageRank

维基百科&#xff1a;在图论和网络分析中&#xff0c;中心性指标为图中相应网络位置的节点分配排名或数值。中心性这一概念最初起源于社交网络分析&#xff0c;因此很多衡量中心性的术语也反映了其社会学背景。 不同中心性指标对 “重要” 的衡量方式不同&#xff0c;因此适用于…

YoLoV7做图像分类/目标检测过程(附代码+详细操作说明)

一、准备数据 图像在my_1imgs中&#xff0c;一个是原图jpg&#xff0c;一个是用labelimg画的标签xml文件。&#xff08;这个画的是一个矩形框&#xff09; 把自己的数据集&#xff08;原图和标签准备好后&#xff09;&#xff0c;这两个文件复制到VOCdevkit中,ImageSets为空。 …

多线程(JavaEE初阶系列5)

目录 前言&#xff1a; 1.什么是定时器 2.标准库中的定时器及使用 3.实现定时器 结束语&#xff1a; 前言&#xff1a; 在上一节中小编给大家介绍了多线程中的两个设计模式&#xff0c;单例模式和阻塞式队列模式&#xff0c;在单例模式中又有两种实现方式一种是懒汉模式&a…

Neo4j图数据基本操作

Neo4j 文章目录 Neo4jCQL结点和关系增删改查匹配语句 根据标签匹配节点根据标签和属性匹配节点删除导入数据目前的问题菜谱解决的问题 命令行窗口 neo4j.bat console 导入rdf格式的文件 :GET /rdf/ping CALL n10s.graphconfig.init(); //初始化 call n10s.rdf.import.fetch(&q…

从Arweave开始:4EVERLAND存储签入挑战开始

嗨&#xff0c;4evers&#xff0c; 今天&#xff0c;我们热烈欢迎您参加 Galxe 上的 4EVERLAND “Arweave 入门”活动。这是一项长期的重头活动&#xff0c;所有参与的用户都有机会获得相应的奖励。 Arweave 是一种革命性的去中心化存储协议&#xff0c;为寻求安全可靠的有价…

ubuntu 开启 ssh 服务 设置root远程登录

设置root用户密码 sudo passwd root安装ssh服务和vim编辑器 sudo apt -y install openssh-server vim开启ssh服务 sudo vim /etc/ssh/ssh_config去掉 配置文件中 Port 22 的注释后保存退出 设置root用户远程登录 sudo vim /etc/ssh/sshd_config将 PermitRootLogin prohibit-pas…

html学习1

1、<!DOCTYPE html>用来告知 Web 浏览器页面使用了哪种 HTML 版本。 2、对于中文网页需要使用 <meta charset"utf-8"> 声明编码&#xff0c;否则会出现乱码。 3、html的结构图&#xff0c;<body> </body>之间的部分可以显示。 4、HTML元素…

[语义分割] DeepLab v2(膨胀卷积、空洞卷积、多尺度信息融合、MSc、ASPP、空洞空间金字塔池化、Step学习率策略、Poly学习率策略)

DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs 论文地址&#xff1a;DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs源码地址&…

C# IO 相关功能整合

目录 删除文件和删除文件夹 拷贝文件到另一个目录 保存Json文件和读取Json文件 写入和读取TXT文件 打开一个弹框&#xff0c;选择 文件/文件夹&#xff0c;并获取路径 获取项目的Debug目录路径 获取一个目录下的所有文件集合 获取文件全路径、目录、扩展名、文件名称 …

8款常用系统镜像烧录软件

系统烧录软件是一种用于将操作系统或其他软件程序安装到嵌入式系统、嵌入式设备或存储设备中的工具。它通常用于将预先编译好的二进制文件或源代码烧录到硬件设备的非易失性存储器中&#xff0c;例如闪存芯片、EEPROM、EPROM或其他存储介质。系统烧录软件提供了一个便捷的方式&…

matplotlib

目录 plot bar pie plot plot可以绘制点图和线图 ?plt.plot #使用?查看plot详细信息 x[1,2,3,4,5] y[16,17,18,19,20] plt.plot(x,y) import numpy as np xnp.arange(0,10) yx*x plt.plot(x,y) xnp.arange(5,15,0.1) ynp.sin(x) plt.plot(x,y,ro) #red circle markers p…

vs2013 32位 编译的 dll,重新用vs2022 64位编译,所遇问题记录

目录 一、vs2013 32 DLL 转 VS2022 64 DLL 所遇问题 1、 LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1900” 2、原先VS2013 现在 VS2022 导致的vsnprintf 重定义问题 3、 无法解析的外部符号 __vsnwprintf_s 4、无法解析的外部符号__imp__CertFreeC…

在线平面设计工具盘点,提升效率首选

在移动应用程序或网页UI设计项目中&#xff0c;在线平面图工具是必不可少的。市场上的在线平面图工具绘制软件丰富多样&#xff0c;层出不穷。作为一名UI设计师&#xff0c;有必要了解哪些在线平面图工具既简单又专业。本文将分享6种在线平面图工具&#xff0c;每种在线平面图工…

199. 二叉树的右视图

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3: 输入: [] 输出: [] 提示…

力扣算法数学类—剑指 Offer 62. 圆圈中最后剩下的数字

目录 剑指 Offer 62. 圆圈中最后剩下的数字 题目背景&#xff1a; 题解&#xff1a; 代码&#xff1a; 结果&#xff1a; 剑指 Offer 62. 圆圈中最后剩下的数字 题目背景&#xff1a; 这是著名的约瑟夫环问题 这个问题是以弗拉维奥约瑟夫命名的&#xff0c;他是1世纪的一名…

【2023最新教程】6个步骤从0到1开发自动化测试框架(0基础也能看懂)

一、序言 随着项目版本的快速迭代、APP测试有以下几个特点&#xff1a; 首先&#xff0c;功能点多且细&#xff0c;测试工作量大&#xff0c;容易遗漏&#xff1b;其次&#xff0c;代码模块常改动&#xff0c;回归测试很频繁&#xff0c;测试重复低效&#xff1b;最后&#x…

机器学习——样本不均衡学习

1、样本不均衡定义 一般在分类机器学习中&#xff0c;每种类别的样本是均衡的&#xff0c;也就是不同目标值的样本总量是接近的&#xff0c;但是在很多场景下的样本没有办法做到理想情况&#xff0c;甚至部分情况本身就是不均衡情况&#xff1a; &#xff08;1&#xff09;很多…

SSL 证书过期巡检脚本

哈喽大家好&#xff0c;我是咸鱼 我们知道 SSL 证书是会过期的&#xff0c;一旦过期之后需要重新申请。如果没有及时更换证书的话&#xff0c;就有可能导致网站出问题&#xff0c;给公司业务带来一定的影响 所以说我们要每隔一定时间去检查网站上的 SSL 证书是否过期 如果公…