web端 设置页面中所有视频未播放时展示的封面图、设置页面中所有视频的宽高(自适应)、设置页面中所有图片的宽高(自适应)

698 阅读2分钟

先看效果

image.png

image.png

场景

  • 有时候我们会在页面中手动写上video、img标签
  • 也可能页面的内容是后端通过富文本传递给我们,我们使用v-html指令进行内容渲染而生成了video和图片

如果是手动写上的video那还好,直接使用video组件,组件会自动帮我们渲染未播放时的封面图,我们也可以设置video组件的宽高

同理,如果是手动写上的img标签那还好,我们可以设置img标签的宽高

但是如果是富文本生成的video,那就有可能出现无法显示未播放时的封面图,以及生成的video的宽度比我们页面上内容盒子的宽度还大的情况(后台插入video时没有限制或故意将video的宽度拉的很大)

同理,如果是富文本生成的图片也一样,可能后台插入图片时没有限制宽高,导致渲染到页面后图片的宽度超过了我们内容盒子的宽度

如下两张图:

image.png

image.png

该怎么解决 ?

问题一:视频未播放时未展示封面图

  • 得到视频的第一帧后使用canvas画上封面图
  • 直接将视频调至0.5s

不推荐使用第一种方法:因为代码较多而且也复杂 反之,第二种就简单多了:只需要获取到页面上所有的video组件,然后将每一个video组件的进度条改成0.5s即可

话不多说,上代码

HTML代码

<div class="richtext" v-html="articleData.content" ref="richTextContainer"></div>

JS代码

// 先调用获取富文本内容的接口
let res = await $get_data()
this.$nextTick(() => {
				const videoElements = this.$refs.richTextContainer.querySelectorAll('video');
				videoElements.forEach((videoElement) => {
					// 设置视频播放时间为0.5秒
                                        videoElement.currentTime = 0.5;
				});
		});

问题二:视频的宽高(自适应)

HTML代码

<div class="richtext" v-html="articleData.content" ref="richTextContainer"></div>

JS代码

// 先调用获取富文本内容的接口
let res = await $get_data()
this.$nextTick(() => {
					const videoElements = this.$refs.richTextContainer.querySelectorAll('video');
                                        // 获取richTextContainer容器的宽度
						let boxWidth = this.$refs.richTextContainer.offsetWidth;
					videoElements.forEach((videoElement) => {
						// 获取视频的宽高
						let videoWidth = Number(videoElement.offsetWidth);
						let videoHeight = Number(videoElement.offsetHeight);

						// 判断视频宽度是否超过容器的宽度 如果超过则将视频的宽高等比例缩放
						if (videoWidth > boxWidth) {
							let scale = videoWidth / boxWidth;
							videoWidth = boxWidth;
							videoHeight = videoHeight / scale;
							videoElement.style.width = videoWidth + 'px';
							videoElement.style.height = videoHeight + 'px';
						}
					});
			});

问题三:图片的宽高(自适应)

HTML代码

<div class="richtext" v-html="articleData.content" ref="richTextContainer" v-loading="loading"></div>

JS代码

loading : false , // 加载中

async getData(){
this.loading = true
// 先调用获取富文本内容的接口
let res = await $get_data()
this.$nextTick(() => {
					// 获取所有的图片元素
					const imgElements = this.$refs.richTextContainer.querySelectorAll('img');

					// 获取richTextContainer容器的宽度
					let boxWidth = this.$refs.richTextContainer.offsetWidth;

					// 处理图片
					imgElements.forEach((imgElement) => {
						// 获取图片的宽高
						let imgWidth = Number(imgElement.offsetWidth);
						let imgHeight = Number(imgElement.offsetHeight);

						// 判断图片宽度是否超过容器的宽度 如果超过则将图片的宽高等比例缩放
						if (imgWidth > boxWidth) {
							let scale = imgWidth / boxWidth;
							imgWidth = boxWidth;
							imgHeight = imgHeight / scale;
							imgElement.style.width = imgWidth + 'px';
							imgElement.style.height = imgHeight + 'px';
						}
					});
				});
this.loading = false;
}

解决两种问题的集合代码

HTML代码

<div class="richtext" v-html="articleData.content" ref="richTextContainer" v-loading="loading"></div>

JS代码

loading : false , // 加载中

async getData(){
this.loading = true
// 先调用获取富文本内容的接口
let res = await $get_data()
this.$nextTick(() => {
					// 获取所有的视频元素
					const videoElements = this.$refs.richTextContainer.querySelectorAll('video');
					// 获取所有的图片元素
					const imgElements = this.$refs.richTextContainer.querySelectorAll('img');

					// 获取richTextContainer容器的宽度
					let boxWidth = this.$refs.richTextContainer.offsetWidth;

					// 处理视频
					videoElements.forEach((videoElement) => {
						// 设置视频播放时间为0.5秒
						videoElement.currentTime = 0.5;

						// 获取视频的宽高
						let videoWidth = Number(videoElement.offsetWidth);
						let videoHeight = Number(videoElement.offsetHeight);

						// 判断视频宽度是否超过容器的宽度 如果超过则将视频的宽高等比例缩放
						if (videoWidth > boxWidth) {
							let scale = videoWidth / boxWidth;
							videoWidth = boxWidth;
							videoHeight = videoHeight / scale;
							videoElement.style.width = videoWidth + 'px';
							videoElement.style.height = videoHeight + 'px';
						}
					});

					// 处理图片
					imgElements.forEach((imgElement) => {
						// 获取图片的宽高
						let imgWidth = Number(imgElement.offsetWidth);
						let imgHeight = Number(imgElement.offsetHeight);

						// 判断图片宽度是否超过容器的宽度 如果超过则将图片的宽高等比例缩放
						if (imgWidth > boxWidth) {
							let scale = imgWidth / boxWidth;
							imgWidth = boxWidth;
							imgHeight = imgHeight / scale;
							imgElement.style.width = imgWidth + 'px';
							imgElement.style.height = imgHeight + 'px';
						}
					});
				});
this.loading = false;
}