为所有弹窗增加全屏切换功能

news/2024/10/21 5:51:04/
1、现状

在开发两个管理系统,现在的页面20+,其中包含不少的弹窗。在项目开发过程中没人提过弹窗要全屏的事情,且在数据量较大的位置已经增加了可全屏的入口。但老板两次说为什么不给所有的弹窗增加全屏的功能,从中感觉到了侮辱,做页面也有些年头,但从没见过有网站所有窗口支持全屏功能的。

2、思考
  • 这个需求是不是合理?

​ 个人认为有20%合理性,这主要是因为在做需求时习惯性忘记要加全屏功能。
​ 80%不合理,因为至少80%的页面没有全屏的必要性,确认弹窗难道也有全屏的必要?

  • 这个需求要不要做?

    这是个伪命题,老板说要还能不做?虽然也不是一定要做。

    其次,这是从技术角度还有些意思的探索。

    所以在没有答应的情况下准备做一些技术实践。

  • 要怎么做?

    a、不可能为每个弹窗单独增加全屏功能

    b、侵入性应该尽量少

    c、接受少量场景缺陷(80%不会触发)

3、实现

使用的是antd + vue3,思路是一样的,其他场景改改可用。

antd中有实现弹窗全屏的实现,我们要做的就是如何简单的实现同一界面多窗口控制。

全屏实现原理:

  • 全屏时通过wrap-class-name设置class
  • 通过class实现全屏
4、干货
  • 全屏事件监听
const isFullScreen = ref<boolean>(false)
// 将多个控制弹窗显示的变量加入监听
watch([blockChainVisible, ()=>userUploadConfig.visible, ()=>modalConfig.visible, kvEditModel, tagEditModel], () => {// 设置 1s 延时,避免弹窗还未显示便执行setTimeout(() => {const html = document.getElementsByClassName('ant-modal-header') || []const len = html.lengthif (len > 0) {for(let i=0; i < len; i++) {// 清理元素已存在监听,并重新增加监听  html[i].removeEventListener('dblclick', () => {})html[i].addEventListener("dblclick", () => {isFullScreen.value = !isFullScreen.value});}}},1000)})
  • 为弹窗增加class绑定

    :wrapClassName="isFullScreen ? 'full-modal':''"
    
  • 设置样式

    .full-modal {.ant-modal {width: 100%;top: 0;padding-bottom: 0;margin: 0;}.ant-modal-content {display: flex;flex-direction: column;height: calc(100vh);width: calc(100vw);}.ant-modal-body {flex: 1;}
    }
    

    因为很多页面都需要这段样式,所以将这段样式写在app.vue

如此,在弹窗显示时,双击标题区可以实现全屏与非全屏切换。

5、待优化项
  • 为弹窗增加显示的切换入口(双击入口不易发现)
  • 配置更加简化

6、更新

既然全屏是通过class实现的,那为何不能通过原始的方式添加class呢?这样就不需要isFullScreen变量及对应的绑定。

于是:可以删除所有isFullScreen相关的代码,只需要如下的监听和full-modal样式就行

watch([blockChainVisible, ()=>userUploadConfig.visible, ()=>modalConfig.visible], () => {setTimeout(() => {const html = document.getElementsByClassName('ant-modal-wrap') || []const len = html.lengthif (len > 0) {for(let i=0; i < len; i++) {html[i].addEventListener("dblclick", () => {if (html[i].classList.value.includes('full-modal')) {html[i].classList.remove("full-modal")} else {html[i].classList.add("full-modal")}});}}},1000)})

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

相关文章

aws cdk 创建eks集群和ecs集群并部署服务

cdk 和 eks 使用cdk版本2.45通过cdk创建eks集群 const cdk require("aws-cdk-lib"); const eks require("aws-cdk-lib/aws-eks"); const ec2 require("aws-cdk-lib/aws-ec2"); const iam require("aws-cdk-lib/aws-iam");class …

编译原理 2 - 词法分析

第3章 词法分析3.1 词法分析器的功能和结构3.2 状态转换图3.3 正则文法 和 正则表达式3.4 有限自动机 DFA与NFA测试第3章 词法分析 重点&#xff1a;① 词法分析器的输入、输出&#xff1b;② 用于识别符号的状态转移图的构造&#xff1b;③ 根据状态转移图实现词法分析器 难点…

Google Earth Engine(GEE)——将每小时降水量转化为逐日的降水量

很多时候我们获取影像的时间分辨率为逐小时,但是如何获取影像的累积降水量?这里的整体思路就是获取不同时间影像的时间序列,然后分别获取每天的降水量,最后同一秋累计值,如果要进行时序图片展示的情况,我们就可以再秋累计值的时候就可以建立一个时间属性,这样可以建立时…

Java_笔记_多态_包_final_权限修饰符_代码块

封装&#xff1a;对象代表什么&#xff0c;就得封装对应的数据&#xff0c;并提供数据对应的行为。 一、多态&#xff1a;对象的多种形态。同类型的对象&#xff0c;表现出的不同形态。 1.多态的表现形式&#xff1a;父类类型 对象名称 子类对象; 学生形态 对象 Student s …

[附源码]计算机毕业设计JAVA中小型艺术培训机构管理系统

[附源码]计算机毕业设计JAVA中小型艺术培训机构管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; S…

真人踩过的坑,告诉你避免自动化测试入门常犯的10个错误

虽然从自己的错误中学习也不错&#xff0c;但从别人的错误中学习总是更好的。 作为一个自动化测试人员&#xff0c;分享常见的容易犯的10个错误&#xff0c;可以从中吸取教训&#xff0c;引以为鉴。 一、必要时才自动化 新人小王接到为Web应用程序自动化测试脚本的任务时&…

InnoDB_Buffer_Pool

说明 对于使用InnoDB存储引擎的表来说, 无论是用于存储用户数据的索引,还是系统数据,都是以页的形式存放在表空间(tablespace)中。所谓的表空间(tablespace),实际是InnoDB对一个或几个实际文件的抽象,最终还是存在磁盘上。当InnoDB处理客户端请求时,如果需要访问某个页的…

30分钟了解linux操作系统内核总结

【推荐阅读】 概述Linux内核驱动之GPIO子系统API接口 一篇长文叙述Linux内核虚拟地址空间的基本概括 轻松学会linux下查看内存频率,内核函数,cpu频率 纯干货&#xff0c;linux内存管理——内存管理架构&#xff08;建议收藏&#xff09; Linux 内核性能优化的全景指南&#xff…