如何实现一个 messagebox/日期组建/popup

常规实现思路

- 新建一个messagebox组建...- 黑色遮罩封装在messagebox中- 黑色遮罩 加上样式{position: fixed:z-index: 999;opcity: .6}收工~
复制代码

这样有两个问题

  • 多个弹窗连续弹出的时候 遮罩层会叠加越来越深
  • 如果再有一个类似的其他弹窗(如第二幅图)还要再写一个遮罩,这个时候他们的层级高低容易出现问题

解决方案:参考mintui 的popup实现方法

对黑色弹窗做统一管理 popup-manager.js

关键就再下面两个方法


openModal: function(id, zIndex, dom, modalClass, modalFade) {if (Vue.prototype.$isServer) return;if (!id || zIndex === undefined) return;this.modalFade = modalFade;const modalStack = this.modalStack;for (let i = 0, j = modalStack.length; i < j; i++) {const item = modalStack[i];if (item.id === id) {return;}}const modalDom = getModal();addClass(modalDom, 'v-modal');if (this.modalFade && !hasModal) {addClass(modalDom, 'v-modal-enter');}if (modalClass) {let classArr = modalClass.trim().split(/\s+/);classArr.forEach(item => addClass(modalDom, item));}setTimeout(() => {removeClass(modalDom, 'v-modal-enter');}, 200);if (dom && dom.parentNode && dom.parentNode.nodeType !== 11) {dom.parentNode.appendChild(modalDom);} else {document.body.appendChild(modalDom);}if (zIndex) {modalDom.style.zIndex = zIndex;}modalDom.style.display = '';this.modalStack.push({ id: id, zIndex: zIndex, modalClass: modalClass });},closeModal: function(id) {const modalStack = this.modalStack;const modalDom = getModal();if (modalStack.length > 0) {const topItem = modalStack[modalStack.length - 1];if (topItem.id === id) {if (topItem.modalClass) {let classArr = topItem.modalClass.trim().split(/\s+/);classArr.forEach(item => removeClass(modalDom, item));}modalStack.pop();if (modalStack.length > 0) {modalDom.style.zIndex = modalStack[modalStack.length - 1].zIndex;}} else {for (let i = modalStack.length - 1; i >= 0; i--) {if (modalStack[i].id === id) {modalStack.splice(i, 1);break;}}}}ifIsNested(modalDom)if (modalStack.length === 0) {if (this.modalFade) {addClass(modalDom, 'v-modal-leave');}setTimeout(() => {if (modalStack.length === 0) {if (modalDom.parentNode) modalDom.parentNode.removeChild(modalDom);modalDom.style.display = 'none';PopupManager.modalDom = undefined;}removeClass(modalDom, 'v-modal-leave');}, 200);}}
};复制代码

modal --表示 黑色遮罩

dom -- 表示 黑色遮罩上面的白色内容区域

当打开弹窗的时候主要做两件事

1 手动生成 modal 并添加到modalDom的父节点下 dom.parentNode.appendChild(modalDom);

- modal 的每一个id 唯一
- modal 的z-index 每当新生成一个都会自增- dom的z-index 每当新生成一个都会自增 且比modal的大一
- appendChild 有一个重要的属性 如果文档树中已经存在了 newchild,它将从文档树中删除,然后重新插入它的新位置,这个有什么用呢,如下 <div id="c"><div id="a"><modal id="我是弹窗a"><zhezhao id="我是遮罩,当弹窗a出来的时候我会被插入到这个位置,我只会有一个"></div><div id="b"><modal id="我是弹窗b"><zhezhao id="我是遮罩,当弹窗b出来的时候我会被插入到这个位置,我只会有一个"></div><modal id="我是弹窗c"><zhezhao id="我是遮罩,当弹窗c出来的时候我会被插入到这个位置,我只会有一个">
</div>如此便能不用手动removechild 同时保证只有一个遮罩,
复制代码

2 把生成的modal 添加到数组里

当关闭弹窗的时候主要做一件事

1 将遮罩的 z-index改成之前保存在数组里的上一个遮罩的index值

如此基本可以满足大部分需求

然而当 popup 嵌套modal的时候 原库会出现modal位置错误的问题

解决方案也很简单在调用关闭方法的时候调用下面方法

/*** 判断modalDom 是否是再其他 popup中嵌套,如果是嵌套则将modal 移动到最外层modal的父节点下面* @param {最后一次生成的modalDom} modalDom */
const ifIsNested = function(modalDom) {if (modalDom) {if (modalDom.parentNode && modalDom.parentNode !== document.body) {if (modalDom.parentNode.parentNode && modalDom.parentNode.parentNode.className && modalDom.parentNode.parentNode.className.indexOf('mint-popup') !== -1) {modalDom.parentNode.parentNode.parentNode.appendChild(modalDom)}  else {isNested(modalDom.parentNode)}}}
}复制代码

补充二

想到一种弹窗组件 按照常规写法,调用的时候如果是要在业务组件里 通过 这样调用 而不是通过 this.$messagebox('')这样调用 会产生的问题

这种情况是 当我们有如下页面


<div class="left" style="z-index:100">我是聊天左侧
</div>
<div class="right  style="z-index:99">我是聊天右侧<messagebox>我是弹窗,无论给我设置多高的zindex 我都不会盖住左侧聊天框</messagebox
</div>复制代码

转载于:https://juejin.im/post/5bc5b2c66fb9a05cd53b2c80

一个popup弹窗实现思路--(基于mintui分析)相关推荐

  1. DL之Keras:基于Keras框架建立模型实现【预测】功能的简介、设计思路、案例分析、代码实现之详细攻略(经典,建议收藏)

    DL之Keras:基于Keras框架建立模型实现[预测]功能的简介.设计思路.案例分析.代码实现之详细攻略(经典,建议收藏) 目录 Keras框架使用分析 Keras框架设计思路 案例分析 代码实现 ...

  2. 实战:基于技术分析的Python算法交易

    译者 | Tianyu 出品 | AI科技大本营(ID:rgznai100) 本文是用 Python 做交易策略回测系列文章的第四篇.上个部分介绍了以下几个方面内容: 介绍了 zipline 回测框架 ...

  3. 基于软件分析的智能化开发新型服务与技术

    摘要:从云服务厂商的角度来给大家介绍一下,当前业界围绕该领域要做哪些事情. 本文分享自华为云社区<基于软件分析的智能化开发新型服务与技术>,作者:敏捷的小智 . 本文以技术文章的方式回顾梁 ...

  4. 模糊图像的倒谱matlab,基于倒谱分析方法的离焦模糊图像特征鉴别

    基于倒谱分析方法的离焦模糊图像特征鉴别 [摘要]在图像拍摄记录的过程中,图像捕获系统因各种原因常常不能精确成像,故而极易产生模糊图像,离焦模糊是常见的模糊图像之一.本文重点介绍了一种倒谱分析方法,在倒 ...

  5. 基于相关性分析和主成分分析的变量筛选方法

    基于相关性分析和主成分分析的变量筛选方法 https://www.zybuluo.com/notmylove/note/1508052 主成分分析法 指标筛选 既然在课程专题四中讲到主成分分析法,那么 ...

  6. 基于关联分析与机器学习的配网台区重过载预测方法

    基于关联分析与机器学习的配网台区重过载预测方法 张国宾,王晓蓉,邓春宇 中国电力科学研究院,北京 100192 摘要:针对配电网运行中长期存在的台区重过载问题,提出基于关联规则挖掘的重过载影响因素分析 ...

  7. 使用java开发一个股票交易及量化投资回测分析系统

    经过近两年的研究和学习,我使用java开发(也使用了部分python,数据源:聚宽)出了一个股票交易及量化投资回测分析系统,将于近期陆续推出系列文章,向大家介绍一下整个开发过程,当整个系列文章都完成后 ...

  8. x86CPU 实模式 保护模式 傻傻分不清楚? 基于Xv6-OS 分析CR0 寄存器

    基于Xv6-OS 分析CR0 寄存器 之前一直认为晕乎乎的...啥?什么时候切换real model,怎么切换,为什么要切换? ------------------------------------ ...

  9. linux下基于内存分析的rootkit检测方法

    0x00 引言 某Linux服务器发现异常现象如下图,确定被植入Rootkit,但运维人员使用常规Rootkit检测方法无效,对此情况我们还可以做什么? 图1 被植入Rootkit的Linux服务器 ...

最新文章

  1. 2017校赛 问题 F: 懒人得多动脑
  2. 台湾澎湖县启动返乡包机 春节疏运增加25个航班
  3. 利用TortoiseSVN获取最新版本的OpenCV源码
  4. 2018.4.2 三周第一次课
  5. 全球及中国电动自行车零件和配件行业运营状况及未来发展趋势预测报告2022年版
  6. Pytorch教程(十五):element-wise、Broadcasting
  7. 搜索引擎分布式爬虫介绍
  8. python自动化工具哪个好用_10款好用的自动化测试工具推荐
  9. Html input 标签
  10. 高端中餐美食餐饮海报PSD模板,看着就有食欲
  11. Linux安装yum过程(超详细!)
  12. 推荐20款每个人都会用到的办公软件
  13. linux多级菜单脚本教程,Linux下使用readline库编程实现多级CLI菜单
  14. 韩顺平老师php从入门到精通149讲
  15. inux命令大全完整版
  16. java提取jks文件提取私钥_如何从JKS文件中取出PEM格式证书
  17. 智慧树python第三章答案_智慧树Python语言应用第三单元章节测试答案选修课网课慕课答案...
  18. 利用个人PC建设小型服务器
  19. NotePad++安装HEX-Editor插件
  20. 程序员日常工作总结2020-01-21

热门文章

  1. conda-forge,conda,-c的理解
  2. 图神经网络的表达能力,究竟有多强大?
  3. 全球及美国首张无人机配送商业化“驾照”先后落地,国内还要多久?
  4. 芯片植入:“增强人类”的生物黑科技
  5. 2030全球新出行产业报告:2.2万亿美元蛋糕将这样分
  6. 一个 Babelfish ,看懂云数据库的发展方向
  7. 因肠道疾病经常上厕所,她被亚马逊解雇了
  8. 作为程序员,你评估工作量留 buffer 吗?
  9. “我辞职了,决定全职去开发我的操作系统!”
  10. 为何 Windows 10X 无法延续 Windows 的成功?