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

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

当我们把弹框改为插入到父元素上

这时候会出现蒙层盖住整个页面,什么也点不了的问题。 这是elementUI官方的一个bug,

解决方案,需把父弹框挂在body中。这时候就有点无解了。

这个多级嵌套问题之前写过一篇文章解决,链接:解决多层弹框嵌套蒙层遮住问题超链接

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

最优方案

实现思路,利用样式,使用当前的这个大屏页面的盒子脱离文档流; 全屏的时候使body全屏,而不是当前大屏页面的大盒子。

给大屏页面的盒子加上动态样式, 高宽都设置铺满,这样就盖住了layout部分了。

javascript 复制代码
: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;
}

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

javascript 复制代码
 <!--  全屏按钮  -->
<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>
      }
    },

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

下面说下另外一个不好方案的思路, 就是创建一个新元素, 手动的把当前的大屏的dom节点append到新元素上,

再讲新元素append到body里达到这个目的。 (但是我们会发现,appendChild这个是移动dom节点,

第一次切换全屏,再切换来,会发现页面空白。原本的dom跑了) 这样我们只能频繁的去append dom节点。页面就反复进行重绘重排

这个全屏是基于大屏的div

javascript 复制代码
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(); // 打开全屏
      }
    },
相关推荐
奇迹_h2 小时前
打造你的HTML5打地鼠游戏:零基础入门实践
前端
SuperEugene2 小时前
Vue生态精选篇:Element Plus 的“企业后台常用组件”用法扫盲
前端·vue.js·面试
Neptune12 小时前
JavaScript回归基本功之---类型判断--typeof篇
前端·javascript·面试
贾铭2 小时前
如何实现一个网页版的剪映(三)使用fabric.js绘制时间轴
前端·后端
子兮曰3 小时前
后端字段又改了?我撸了一个 BFF 数据适配器,从此再也不怕接口“屎山”!
前端·javascript·架构
万少5 小时前
使用Trae轻松安装openclaw的教程-附带免费token
前端·openai·ai编程
浪浪山_大橙子5 小时前
OpenClaw 十分钟快速,安装与接入完全指南 - 推荐使用trae 官方 skills 安装
前端·人工智能
忆江南5 小时前
iOS 可视化埋点与无痕埋点详解
前端
离开地球表面_995 小时前
金三银四程序员跳槽指南:从简历到面试再到 Offer 的全流程准备
前端·后端·面试
_柳青杨5 小时前
跨域获取 iframe 选中文本?自己写个代理中间层,再也不求后端!
前端