vue中调用全屏方法、 elementUI弹框在全屏模式下不出现问题、多级嵌套弹框蒙层遮挡问题等处理与实现方案

vue3+screenfull实现部分页面全屏2025年3.13更新(遇到的问题会持续更新) 需求:除了左侧菜单,右侧主体部分全部全屏首先下载screenfull全屏插件页面引入我这里是右上角全屏图标</ 阅读详情
AI摘要

本文围绕Vue中全屏及ElementUI弹框问题展开。全屏模式下弹框不展示、蒙层遮挡等问题较为常见。介绍了最优方案,即利用样式让大屏页面盒子脱离文档流,使body全屏;也提及不太好的方案,操作dom会导致页面重排重绘。还解决了F11、esc退出全屏顶部丢失的问题。

全屏模式下弹框不展示的原因是elementUI的弹框我们让他挂在body中了,而我们全屏的div盒子不是整个文档,这时候就找不到弹框了。
当我们把弹框改为插入到父元素上

在这里插入图片描述

这时候会出现蒙层盖住整个页面,什么也点不了的问题。 这是elementUI官方的一个bug,
解决方案,需把父弹框挂在body中。这时候就有点无解了。
这个多级嵌套问题之前写过一篇文章解决,链接:解决多层弹框嵌套蒙层遮住问题超链接

先介绍最优的方案,然后再介绍一种不太好的方案(为啥说不好呢,因为它是操作dom,会导致只要切换全屏、退出全屏,整个页面就进行重排重绘)

最优方案

实现思路,利用样式,使用当前的这个大屏页面的盒子脱离文档流; 全屏的时候使body全屏,而不是当前大屏页面的大盒子。
给大屏页面的盒子加上动态样式, 高宽都设置铺满,这样就盖住了layout部分了。

:class="{ 'fullMapWrapper': isFullScreen }"

// 全屏外层div
.map-wrapper.fullMapWrapper {
  position: fixed !important;
  width: 100vw !important;
  height: 100vh !important;
  z-index: 1500 !important;
  top: 0 !important;
  left: 0 !important;
}

全屏,退出全屏部分的代码

 <!--  全屏按钮  -->
<div class="fullMap"><i class="el-icon-full-screen" @click="fullMap()"></i></div>

data() {
    return {
      isFullScreen: false, // 是否全屏
    }
 },

/** 全屏 */
    fullMap() {
      this.isFullScreen = !this.isFullScreen;
      //判断是否处于全屏模式
      if(document.fullscreenElement) {
        //退出全屏
        document.exitFullscreen();
        this.isFullScreen = false;
        //处于全屏模式的元素
        // console.log(document.fullscreenElement);   //null
      }else {
        //全屏显示, 让body全屏
        document.body.requestFullscreen();
        this.isFullScreen = true
        //处于全屏模式的元素
        // console.log(document.fullscreenElement);   //<html lang="en">......</html>
      }
    },

这样就完美解决的问题,也没后遗症。

遇到一个小问题,就是键盘的F11 esc 退出,会出现顶部丢失的情况,因为被固定定位样式覆盖了。解决方法:

onFullScreenChange() {
      if (document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement) {
        this.isFullScreen = true;
      } else {
        this.isFullScreen = false;
      }
    },

 mounted() {
    // 监听全屏状态变化
    document.addEventListener('fullscreenchange', this.onFullScreenChange);
    document.addEventListener('webkitfullscreenchange', this.onFullScreenChange); // Safari
    document.addEventListener('mozfullscreenchange', this.onFullScreenChange); // Firefox
    document.addEventListener('msfullscreenchange', this.onFullScreenChange); // IE/Edge
  },
  beforeDestroy() {
    dateTimer && clearTimeout(dateTimer); // 大屏时间的定时器
    // window.removeEventListener('keydown', this.handleKeydown);
    document.removeEventListener('fullscreenchange', this.onFullScreenChange);
    document.removeEventListener('webkitfullscreenchange', this.onFullScreenChange);
    document.removeEventListener('mozfullscreenchange', this.onFullScreenChange);
    document.removeEventListener('msfullscreenchange', this.onFullScreenChange);
  },

下面说下另外一个不好方案的思路, 就是创建一个新元素, 手动的把当前的大屏的dom节点append到新元素上,
再讲新元素append到body里达到这个目的。 (但是我们会发现,appendChild这个是移动dom节点,
第一次切换全屏,再切换来,会发现页面空白。原本的dom跑了) 这样我们只能频繁的去append dom节点。页面就反复进行重绘重排
这个全屏是基于大屏的div

let parentDom = null
let mapDiv = null

 mounted() {
    parentDom = document.createElement('div'); // 创建一个新的元素
    mapDiv = document.getElementById('map-wrapper')
    parentDom.id = 'bodyDiv'
    parentDom.classList.add("parent-div");
    parentDom.style.height = '100%'
    parentDom.style.width = '100%'
    parentDom.appendChild(mapDiv)
    document.body.appendChild(parentDom) // 将元素添加到body中
    parentDom.style.display = 'none'
     // 这个是当前大屏页面的上一个盒子
    document.getElementsByClassName('main-container-box')[0].appendChild(mapDiv)
  },

方法
/** 全屏 */
    fullMap() {
      this.isFullScreen = !this.isFullScreen;

       if(document.fullscreenElement) { // 全屏模式
         let bodyDiv = document.getElementById('bodyDiv')
        if(bodyDiv) {
           bodyDiv.style.display = 'none'
        }
         document.getElementById('app').style.display = 'block'
         // 这个是当前大屏页面的上一个盒子
         document.getElementsByClassName('main-container-box')[0].appendChild(mapDiv)
         //   //退出全屏
         document.exitFullscreen(); // 退出全屏
       } else {
         document.getElementById('app').style.display = 'none'
         parentDom.appendChild(mapDiv)
         parentDom.style.display = 'block'
         document.body.requestFullscreen(); // 打开全屏
      }
    },
PCB设计教程【入门篇】——PCB设计基础-PCB构成与组成 本教程基于B站Expert电子实验室的PCB设计教学的整理,为个人学习记录,旨在帮助PCB设计新手入门。所有内容仅作学习交流使用,无任何商业目的。若涉及侵权,请随时联系,将会立即处理。 阅读详情

相关推荐

IEEE Access投稿全流程解析:从初次提交到最终接收的完整指南

本文详细解析了IEEE Access期刊从初次投稿到最终接收的全流程,包括ORCID注册、论文投稿七步法、回稿再投流程及最终版提交等关键步骤。特别强调了4-6周快速同行评审的特点,为研究者提供了一份实用的投稿指南,帮助高效完成IEEE Access期刊投稿。

weixin_29273849的博客 915

vue弹窗全屏

:fullscreen="true"

weixin_58414196的博客 1251

gps matlab 书,《GPS基本原理及其Matlab仿真》杨俊.pdf

本书讲述了全球定位系统(GPS)的基本原理和概念,具体包括:GPS测量原理、GPS的结构和发展历史;GPS伪距定位和载波相位定位的原理;GPS中使用的坐标系和时间系统;C/A码的实现原理及载波调制过程;GPS信号捕获和跟踪原理及实现;便携式GPS系统的设计与实现及常用芯片资料等。此外,本书还讲了利用Matlab仿真GPS中涉及到的各种算法和原理,并且给出了所有仿真源程序和仿真框图。利用Matlab...

weixin_33603105的博客 1176

vue项目中实现全屏效果

vue中实现全屏按钮功能

weixin_53579370的博客 5383

windows11 远程桌面连接 通过代理连接RDP桌面报错 错误代码0x904 拓展错误代码0x7

打开windows Defender防火墙设置--允许应用通过防火墙更改设置--允许其他应用浏览--进入C:\WINDOWS\system32目录选择mstsc.exe进入C:\Windows\SysWOW64目录h'qmstsc.exe添加后列表里多了一个远程桌面连接,还有一个Remote Desktop Connection,配置网络权限后保存连接成功。

weixin_43978891的博客 1万+

Calibre PEX提参实战:如何用hcell和xcell文件精准屏蔽模块(附避坑指南)

本文深入解析Calibre PEX工具中hcell与xcell文件的协同工作机制,提供模块级寄生参数提取方案。通过实战案例和避坑指南,帮助工程师精准屏蔽已验证IP模块,提升仿真效率和数据一致性,适用于65nm以下工艺节点的复杂SoC设计。

weixin_29275257的博客 627

vue页面或者网页全屏后,modal 弹框或者下拉框无法显示的问题

项目场景:vue页面或者网页全屏后,modal 弹框或者下拉框无法显示的问题 问题描述: 页面主体部分全屏后,页面中的所有弹窗和下拉框不能显示,退出全屏后,弹窗正常。原因:项目主体全屏后,层级最高,弹出会被盖在app层级下面,不能显示。 解决方案: 只需要调用document.documentElement // 全屏 requestFullscreen = (element) => { const element = element || document.documentElement

woyaojinali的博客 9161

银河麒麟V10搭建vsftpd

1、查看是否有安装过2、安装3、服务启动步骤设置开机启动并此次立即启动启动重启停止查看状态4、系统防火墙放行ftp服务如果没有重要的数据在服务器里面,或者在本地虚拟机中外网无法访问的情况下,建议直接关闭防火墙即可省略以上繁琐的步骤。

hhq850741642的博客 6484

MySQL存储过程教程(pdf)

详细介绍MySQL的存储过程…… 个人觉得不错,拿出来跟大家分享一下。 希望对大家有所帮助!

Time and time 492

利用大模型和聚类算法找出 Excel 文件中重复或相似度高的数据,并使用 FastAPI 进行封装的详细方案

tokenizer将输入的文本列表texts转换为 PyTorch 张量,同时进行填充和截断操作,以确保所有输入具有相同的长度。对输入进行推理,得到模型的输出。对模型的最后一层隐藏状态求平均,得到每个文本的向量表示。.numpy()将 PyTorch 张量转换为 NumPy 数组。使用DBSCAN算法对文本向量进行聚类。eps是邻域半径,是形成核心点所需的最小样本数。fit方法对输入的向量进行聚类,并返回每个样本所属的簇标签。try:定义了一个 POST 请求的 API 路由,路径为。

AI的内部世界的博客 1069

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

statistics+insight+vista+power 359

vue+TS+全屏弹窗组件

历史文章目录连接:https://blog.csdn.net/yy763496668/article/details/113117040此链接为优快云连接,目的为方便大家一览博客目录!内...

杨勇博客之家 854

NeRF-Pytorch(训练自己的数据集过程全记录+环境配置+COLMAP+问题解决)

写于2025/1/26,在用NeRF训练自己的数据集过程中该踩的坑都踩过了,发现网上并没有详细完整写这些问题解决过程的帖子,遂自己进行一个全记录和复盘。 整篇文章包括:NeRF训练环境配置;COLMAP三维重建过程(直接给出代码,规避一些bug);在训练时候出现的问题。 本篇文章仅针对llff格式数据集。

m0_62577716的博客 1774

vue 点开弹窗最大化_vue 全屏弹窗(从底部上滑出现)

.fullscreen-dialog-wrapper{position: fixed;top: 0;right: 0;bottom: 0;left: 0;overflow: auto;margin: 0;z-index: 1001;opacity: 1;}.fullscreen-dialog{position:relative;margin:0 auto 50px;background:#fff;...

weixin_39583521的博客 1484

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

vue项目添加全局消息弹窗

vue项目添加全局消息弹窗

weixin_51139133的博客 2313

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

vue-fullscreen实现全屏功能

1、下载vue-fullscreen依赖。2、在mian.js中引用并注册。

Queen-Shir的博客 3528

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

js、vue如何自动全屏显示

js、vue如何自动全屏显示

qq_52499093的博客 6837

vue项目全屏功能及局部全屏下使用ant-design-vue中弹框类组件不展示

全屏下ant组件被覆盖

weixin_43840320的博客 2392

【vue】 页面全屏用法介绍

vue 全屏用法介绍

weixin_55639808的博客 3218

前端使用fullscreen全屏模式后,弹窗显示在全屏模式之下的问题怎么解决?

指的是全屏的dom元素,在其之内的元素在全屏后都可以正常访问。使用a-model中的apigetContainer。中就不能正常在全屏模式下访问!如果要访问的dom不在。

weixin_45930242的博客 1506

实现页面局部全屏以及elementUI弹出层失效/错位问题解决

实现页面局部全屏以及elementUI弹出层失效/错位问题解决

weixin_44667515的博客 1657

全屏后 element-ui 组件不显示

elementPlus中的tooltip,默认挂载在body下,使用fullScreen进行全屏后,查看弹框,发现其实提示弹框是正常加载的,但是挂载在body下: 查看tooltip文档说明,发现有属性设置提示内容附加在哪一个元素上,而翻看源码可知,默认会创建一个div放置,而这个div又会挂载在body上 而全屏时,fullscreen的并不是整个body,所以导致无法正常展示提示信息,所以需要将提示信息绑定在fullscreen进行全屏的元素的内部,那么就可以利用append-to进行设置。

虎康的博客 2344

Vue 当页面进入全屏状态时element-ui的el-select下拉菜单不显示问题

这应该也是不将弹出框插入至 body 元素之中的原因,所以就给el-select写个状态:全屏时popper-append-to-body为false,非全屏时为true。但在写完之后,发现还是不行,甚至又回到了没加popper-append-to-body的情况(全屏不显示下拉菜单)。在前两天进行页面全屏时,一切都还好好的,可当使用element-ui中的el-select时,下拉菜单却怎么也显示不出来,但只要退出全屏状态,立马就好。可随之而来新的问题产生,非全屏状态下,我的下拉菜单无法完全显示出来了!

weixin_64482155的博客 8022

解决浏览器在局部区域全屏下,elementUI部分弹窗组件无法正常显示的问题,如Notification,Message等

解决局部全屏下,部分element组件无法使用的问题。使用screenfull.js将特定区域(某个div)局部全屏,全屏状态下,服务器推送消息,前端使用组件弹窗显示。

juhuagg的博客 3856

vue element 的 dialog 弹出窗口加上 最大化 还原 和自定义拖拽、拉伸弹窗

原理是 利用vue 的自定义指令功能 自定义一个指令 官方文档 下面是指令内容 export default { bind(el, binding, vnode, oldVnode) { //弹框可拉伸最小宽高 let minWidth = 400; let minHeight = 300; //初始非全屏 let isFullScreen = false; //当前宽高 let nowWidth = 0; let nowHight = 0

u010454239的博客 7785

element ui中当el-dialog需要做全屏时,.fullscreen样式修改问题

我在使用过程中,发现弹窗行间样式不是我想要的,但是通过定义classname,然后在进行样式的更改不起作用,由于权重的问题,在样式后面添加!important 无穷权重也是不可以。

ycoder的博客 1135
上一篇: uniapp使用中小问题及解决方法集合
下一篇: elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案
别忘了微笑_cuicui
博客等级 码龄8年 227粉丝 99原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值