VUE 实现全屏指令方法

news/2024/11/23 9:39:03/

公司项目实现全屏功能,用到的地方很多,想到用vue指令实现

main.js 

import popupManager from '@element-ui/lib/lib/utils/popup/popup-manager' Vue.prototype.gcommonPopupManager = popupManager

screenFull.js

import Vue from 'vue'
const executor = (el, binding) => {const { tagName } = elconst { id, className, fn, fullAside = true } = binding.valueconst fullClass = fullAside ? 'screen-full-in-aside' : 'screen-full-out-aside'let fullDoc = document.querySelector('#' + id) ?? document.querySelector('.' + className)el.style.cursor = 'pointer'if (tagName === 'I' || tagName === 'SPAN') {el.classList.add('el-icon-full-screen')el.addEventListener('click', e => {e.stopPropagation()Vue.prototype.gcommonPopupManager.zIndex = 2008fullDoc.classList.toggle(fullClass)let flag = fullDoc.classList.value.includes(fullClass)flag? el.classList.replace('el-icon-full-screen', 'el-icon-full-screen-exit'): el.classList.replace('el-icon-full-screen-exit', 'el-icon-full-screen')onmouseleave()fn && fn(flag)})// 鼠标移入时,将浮沉元素插入到body中el.onmouseenter = onmouseenter(fullDoc)// 鼠标移动时,动态修改浮沉的位置属性el.onmousemove = e => onmousemove(e)// 鼠标移出时将浮层元素销毁el.onmouseleave = onmouseleave} else if (tagName === 'BUTTON') {const fullScreen = `<i class="el-icon-full-screen" style="padding-right: 5px"></i>全屏`const fullScreenOut = `<i class="el-icon-full-screen-exit" style="padding-right: 5px"></i>退出全屏`el.innerHTML = fullScreenel.addEventListener('click', e => {e.stopPropagation()Vue.prototype.gcommonPopupManager.zIndex = 3000fullDoc.classList.toggle(fullClass)let flag = fullDoc.classList.value.includes(fullClass)el.innerHTML = flag ? fullScreenOut : fullScreenfn && fn(flag)})}
}
const onmouseenter = fullDoc => {return function () {// 创建浮层元素并设置样式const vcTooltipDom = document.createElement('div')vcTooltipDom.style.cssText = `overflow: auto;position:fixed;border-radius:5px;display:inline-block;font-size: 12px;z-index:2501;background: rgba(0,13,31,.85);color: #fff;padding: 2px 10px;line-height: 20px;box-shadow: 0 12px 32px 0 rgb(0 13 31 / 10%);`// 设置id方便寻找vcTooltipDom.setAttribute('id', 'vc-tooltip')// 将浮层插入到body中document.body.appendChild(vcTooltipDom)// 浮层中的文字 通过属性值传递动态的显示文案let flag = fullDoc.classList.value.includes('screen-full')document.getElementById('vc-tooltip').innerHTML = flag ? '退出全屏' : '全屏'}
}
const onmousemove = e => {window.requestAnimationFrame(() => {const vcTooltipDom = document.querySelector('#vc-tooltip')if (!vcTooltipDom) returnvcTooltipDom.style.top = e.clientY - 35 + 'px'vcTooltipDom.style.left = e.clientX - 15 + 'px'})
}
const onmouseleave = () => {// 找到浮层元素并移出const vcTooltipDom = document.getElementById('vc-tooltip')vcTooltipDom && document.body.removeChild(vcTooltipDom)
}
const screenfull = {inserted: (el, binding) => executor(el, binding)
}
export default {install(Vue) {Vue.directive('screenfull', screenfull)}
}

css 部分 (肯不满足各位要求,自己去设置样式)

.screen-full-in-aside {position: fixed;top: 0;left: 0;width: 100%;height: 100%;padding: 0.5em 1em;background-color: #ffffff;z-index: 2005;
}
.screen-full-out-aside {position: absolute;top: 0;left: 0;width: 100%;height: 100%;padding: 0.5em 1em;background-color: #ffffff;z-index: 2000;
}

示例:

按钮全屏:

<el-buttonv-screenfull="{className: 'flow-alter-draft',fn: setTableHeight}"
></el-button>

图标全屏:

<i v-screenfull="{ className: 'flow-alter-draft', fn: setTableHeight }" ></i>

<span v-screenfull="{ className: 'flow-alter-draft', fn: setTableHeight }" ></span>

参数: 

id&&className 必填(二选一)

fn: 全屏后的回调函数,返回参数为true/false

fullAside: 是否全屏(遮挡左侧菜单) true/false


http://www.ppmy.cn/news/220793.html

相关文章

Centos7更换OpenSSL版本

OpenSSL 1.1.0 用户应升级至 1.1.0aOpenSSL 1.0.2 用户应升级至 1.0.2iOpenSSL 1.0.1 用户应升级至 1.0.1u 查看openssl版本 openssl version -v选择升级版本 我的版本是OpenSSL 1.0.2系列&#xff0c;所以要升级1.0.2i https://www.openssl.org/source/old/1.0.2/openssl-…

14.wxs

wxs&#xff08;WeiXin Script&#xff09;是小程序独有的一套脚本语言&#xff0c;可以理解为 微信的JS wxs与JS有区别&#xff0c;wxs有自己的数据类型&#xff0c;JS基本全是obj&#xff0c;wxs的数据类型有 number,string,boolean,object,function,array,date,regexp&…

安装linux系统遇到的问题

sata控制模式更改如上图 文件系统不在挂载点&#xff0c;在文件系统选 参考&#xff1a;https://zhuanlan.zhihu.com/p/148855857?from_voters_pagetrue

J1900 安装 OpenWrt 软路由到物理硬盘

1、准备一个U盘&#xff0c;把 "微PE" 刷到U盘中 2、把 "OpenWrt" 固件和写盘工具 "physdiskwrite" 放进U盘里 写盘工具&#xff1a;m0n0wall - physdiskwrite 3、开机启动&#xff0c;启动顺序调整为 "U盘" 启动 4、在PE环境下运行…

赛扬处理器_英特尔发布11代奔腾、赛扬处理器 均支持AVX指令集

9月3日凌晨&#xff0c;英特尔发布了9款11代酷睿处理器&#xff0c;英特尔还表示第11代的奔腾、赛扬、博锐平台以及DG1独立显卡将在晚些时候发布。 日前&#xff0c;英特尔终于低调上线了三款基于Tiger Lake的11代奔腾、赛扬处理器。这三款处理器分别是奔腾金牌7505、赛扬6305和…

此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态

此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态。如果已在 BIOS/固件设置中禁用 Intel VT-x&#xff0c;或主机自更改此设置后从未重新启动&#xff0c;则 Intel VT-x 可能被禁用…未能启动虚拟机。 Intel VT-x完整名称是Intel Virtualization Technology&#…

ESXi睿频检测

ESXi的VM中显示主机频率是恒定的&#xff0c;因此无法知道实际CPU是否睿频。通过查阅相关资料得出可以使用esxtop命令查看CPU实际频率。 以下是操作步骤 1.启动ESXi ssh服务。 2.使用ssh工具连接主机 3.执行esxtop 4.依次按p,f,f,回车 5.使用A/MPERF列数据*cpu基础频率得到的就…

zoj 3160

11月19号准备做的题。。。拖了2个月。。。。 http://acm.hust.edu.cn:8080/judge/contest/view.action?cid17253#problem/G 还是想清楚再敲码&#xff0c;不然后面再修修补补容易出错。。。 #include<iostream> #include<stdio.h>using namespace std; int f[304]…