el-image实现全屏预览以及修改底部操作按钮

系统自带:

改造后:

需求:修改底部缩放比例按钮为全屏功能,修改旋转按钮功能为切换上一张/下一张图片。

改造思路:

1.参考官方组件源码,需要调用点击事件。官方代码库UNPKG - element-ui

2.调用键盘F11键实现图片全屏预览。

3.监听键盘左右键实现切换上一张/下一张图片。

4.切换图片时候需要判断当前是否全屏状态。

废话少说,开干~

<template>
	<div>
		<el-image ref="elImage" style="width: 0; height: 0;" 
			:preview-src-list="logicImageList">
		</el-image>
		
		<el-button @click="PreviewImg">预览图片</el-button>
	</div>
</template>
<script>
	export default {
		data() {
			return {
				logicImageList: [], //图片列表,格式为['xxxx.png','xxx.png']
				full: false, //是否全屏
			}
		},
		methods: {
			PreviewImg() {
				this.$nextTick(() => {
					this.$refs.elImage.clickHandler() //触发el-image组件
					setTimeout(() => {
						let that = this
						let inner = document.querySelector('.el-image-viewer__actions__inner'); //底部操作栏div
						let close = document.querySelector('.el-image-viewer__close'); //蒙层关闭按钮
						let next = document.querySelector('.el-image-viewer__next'); //下一页
						let prev = document.querySelector('.el-image-viewer__prev'); //上一页

						// 获取要删除的 li 元素
						var screen = document.querySelector(".el-icon-full-screen");
						var liElement = document.querySelector(".el-icon-refresh-left");
						var riElement = document.querySelector(".el-icon-refresh-right");
						var divider = document.querySelectorAll('.el-image-viewer__actions__divider')
						// 获取 li 元素的父节点 ul
						var parentNode = liElement.parentNode;
						// 从父节点中移除 li 元素
						for (var i = 0; i < divider.length; i++) {
							divider[i].parentNode.removeChild(divider[i]);
						}
						// 删除缩放按钮,删除两个旋转按钮
						parentNode.removeChild(screen);
						parentNode.removeChild(riElement);
						parentNode.removeChild(liElement);

						// 创建全屏按钮,切换上一张/下一张按钮
						let e = document.createElement('i')
						let f = document.createElement('i')
						let g = document.createElement('i')
						e.innerHTML = `<i class="el-icon-full-screen"></i>`
						f.innerHTML = `<i class="el-icon-arrow-left"></i>`
						g.innerHTML = `<i class="el-icon-arrow-right"></i>`
						f.onclick = function pre() { //上一张
							that.$refs.elImage.$children[0].prev()
							setTimeout(() => {
								that.utilStyle()
							}, 50)
						}
						g.onclick = function next() { //下一张
							that.$refs.elImage.$children[0].next()
							setTimeout(() => {
								that.utilStyle()
							}, 50)
						}
						// 全屏操作
						e.onclick = function fullScreen() {
							var screen = document.querySelector(".el-icon-full-screen");
							var menu = document.querySelector(".el-icon-menu");
							var canvas = document.querySelector(".el-image-viewer__canvas")
							let allImg = canvas.getElementsByTagName('img')
							if (!that.full) {
								that.full = true
								allImg[0].style.width = '100%'
								allImg[0].style.height = '100%'
								screen.classList.replace("el-icon-full-screen", "el-icon-menu");
								document.documentElement
							.requestFullscreen(); //Chrome、Firefox、IE 11+和Edge浏览器
								document.documentElement
							.webkitRequestFullscreen(); //Safari和Chrome 49之前版本
								document.documentElement.mozRequestFullScreen(); //Firefox
								document.documentElement.msRequestFullscreen(); //IE 11
							} else {
								allImg[0].style.width = ''
								allImg[0].style.height = ''
								allImg[0].style.maxWidth = '100%'
								allImg[0].style.maxHeight = '100%'
								menu.classList.replace("el-icon-menu", "el-icon-full-screen");
								that.full = false
								document.exitFullscreen(); // 如果当前处于全屏状态则会退出全屏
							}
						}
						close.addEventListener("click", function() {
							document.exitFullscreen(); // 如果当前处于全屏状态则会退出全屏
							that.full = false
						});
						next.addEventListener("click", function() {
							that.utilStyle()
						});
						prev.addEventListener("click", function() {
							that.utilStyle()
						});
						// 监听键盘按下左右键
						document.onkeydown = function showkey() {
							var key = event.keyCode;
							switch (key) {
								case 37:
									setTimeout(() => {
										that.utilStyle()
									}, 50)
									break;
								case 39:
									setTimeout(() => {
										that.utilStyle()
									}, 50)
									break;
							}
						};
						inner.appendChild(e);
						inner.appendChild(f);
						inner.appendChild(g);
					}, 50)
				})
			},
			// 判断是否全屏显示
			utilStyle() {
				let menu = document.querySelector('.el-icon-menu');
				if (menu) {
					var canvas = document.querySelector(".el-image-viewer__canvas")
					let allImg = canvas.getElementsByTagName('img')
					allImg[0].style.width = '100%'
					allImg[0].style.height = '100%'
				}
			}
		}

	}
</script>
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

9.13分

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值