element label动态赋值_基于Element封装可拖动放大缩小的弹窗

ElementUI 自带的对话框组件(el-dialog)没有拖动和最小化的处理,目前业务遇到呼叫弹屏处理,基于el-dialog 再次进行封装下,上篇文章有人说图片换成代码就好了,下面代码部分我就直接放代码了,不再用图片处理了。

先看看效果吧

5d709d8adbf1e6312bebffe889088674.gif

效果gif

下面拆分说明(拖动,全屏,缩放,关闭)

拖拽属性

注册dialogDrag的指令,这样就可以在拖拽弹框的地方直接用v-dialogDrag

这部分代码我借鉴别人写的,主要原理是获取dom节点,根据鼠标按下移动和放开的事件,以当前窗口为基进行位置改变移动。

// v-dialogDrag: 弹窗拖拽属性Vue.directive('dialogDrag', {  bind(el, binding, vnode, oldVnode) {    const dialogHeaderEl = el.querySelector('.el-dialog__header');    const dragDom = el.querySelector('.el-dialog');    dialogHeaderEl.style.cssText += ';cursor:move;'    dragDom.style.cssText += ';top:0px;'    // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);    const sty = (() => {      if (window.document.currentStyle) {        return (dom, attr) => dom.currentStyle[attr];      } else {        return (dom, attr) => getComputedStyle(dom, false)[attr];      }    })()    dialogHeaderEl.onmousedown = (e) => {      // 鼠标按下,计算当前元素距离可视区的距离      const disX = e.clientX - dialogHeaderEl.offsetLeft;      const disY = e.clientY - dialogHeaderEl.offsetTop;      const screenWidth = document.body.clientWidth; // body当前宽度      const screenHeight = document.documentElement.clientHeight; // 可见区域高度(应为body高度,可某些环境下无法获取)      const dragDomWidth = dragDom.offsetWidth; // 对话框宽度      const dragDomheight = dragDom.offsetHeight; // 对话框高度      const minDragDomLeft = dragDom.offsetLeft;      const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth;      const minDragDomTop = dragDom.offsetTop;      const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight;      // 获取到的值带px 正则匹配替换      let styL = sty(dragDom, 'left');      let styT = sty(dragDom, 'top');      // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px      if (styL.includes('%')) {        styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100);        styT = +document.body.clientHeight * (+styT.replace(/%/g, '') / 100);      } else {        styL = +styL.replace(/px/g, '');        styT = +styT.replace(/px/g, '');      };      document.onmousemove = (e) => {        // 通过事件委托,计算移动的距离        let left = e.clientX - disX;        let top = e.clientY - disY;        // 边界处理        if (-(left) > minDragDomLeft) {          left = -(minDragDomLeft);        } else if (left > maxDragDomLeft) {          left = maxDragDomLeft;        }        if (-(top) > minDragDomTop) {          top = -(minDragDomTop);        } else if (top > maxDragDomTop) {          top = maxDragDomTop;        }        // 移动当前元素        dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`;      };      document.onmouseup = (e) => {        document.onmousemove = null;        document.onmouseup = null;      };    }  }})

操作按钮(全屏,最小化,关闭)

首先去掉默认的关闭图标 show-close=“false",然后在title 的插槽中,放入我们需要的操作按钮或者图标,具体排列样式用css 控制就好了。

91023c62daca9c59e4b7f29826845775.png

相关代码区域

事件处理

我们在处理这个的时候不可避免的遇到了需要更改props属性的问题,我们知道vue中默认的组件中是不能修改props 属性的,如果非要改当然也有别的办法。

第一种方法就是 data 中重新定义一个变量初始用props 传入的值

第二种方法就是 用computed计算属性

第三种方法就是 $emit 触发事件,父组件去处理事件

第四种方法就是 用.sync修饰符 ,本文用到的是这种方法

具体怎么用.sync 修饰符呢,看下面这个小例子

// 父组件// 子组件

其他弹窗事件正常$emit 抛出就可以了

组件封装代码

{{ title }}
{{minContent}}

组件调用

打开弹框

这是弹框内容区域

事件及属性说明

除了特殊的支持 element dialog 的全部属性,也就是文档上的属性都可以用

type: 默认是弹框,如果要最小化的显示就指名不需要就不用传递这个参数

fullscreen.sync: 如果需要自定义动态设置全屏,记得绑定.sync 修饰符

f259ee4c1cb0d700544acd2376d06896.png

element-ui dialog 文档

总结

以上就是对弹窗组件的封装代码也都在上面了,总的来说业务开发的时候,有轮子最好可以直接用,没有还是需要造造,如果上面写的有问题或多那一部分不理解的,欢迎下面讨论,我们一起学习一起进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eeg数据集_运动想象,情绪识别等公开数据集汇总

本文来自脑机接口社区运动影像数据Left/Right Hand MI: http://gigadb.org/dataset/100295Motor Movement/Imagery Dataset: https://www.physionet.org/physiobank/database/eegmmidb/Grasp and Lift EEG Challenge: https://www.kaggle.com/c/grasp-and-lift-eeg-detection/d…

excel批量删除公式保留数据_Excel实用tips(17) – 批量删除隐藏的工作表

大家可能遇到过这种情况:一个几经易手的远古 Excel 表,文件巨大无比,运行极慢,删除数据和公式也无济于事。反复查找原因,才发现表格中有好几十个隐藏的 worksheet,这些 worksheet 大多都是一些草稿表&#…

docker 修改阿里镜像源_使用阿里云容器镜像服务托管私有Docker镜像

一个只用markdown语法编写文章的90后野路子Web架构师,每天都分享一些有用的知识点,欢迎关注~前言概述本文主要讲解如何托管自己的Docker镜像到阿里云容器镜像服务ACR上,以及如何使用镜像加速器来提升获取Docker官方镜像的速度。名…

java 把图片插入窗体,JAVA JFrame窗体添加背景图像的两种方法

首先还是要了解框架JFrame中的层次结构。JFrame中的层次分布及相对关系是:最底层是:JRootPane;第二层是:JlayerPane;最上层就是ContentPane,也正是我们常说的内容面板。所以一般我们拖放的控件就是在ContentPane层上。有了这些常识…

图像识别开源代码_灰度图像着色开源代码

Victory组近期整理了灰度图像着色开源代码,文章刊登于《中国计算机学会计算机视觉专委会简报》2019年第2期上。灰度图像(gray image)是每个像素只有一个采样颜色的图像,即单通道图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度&#xf…

【adb】电脑通过ADB向手机传输文件

具体步骤如下: Step1 下载ADB工具 下载最新版本的 ADB工具 !!! 注意:一定要是最新版本的ADB,否则很可能导致无法识别到手机。 将下载的ADB解压以后的文件如下图所示: Step2 添加环境变量 将 ADB的路径 D:\platformtools &…

git 提交文件_GIT不小心提交了大文件导致提交失败怎么办?

出现问题的原因在commit的时候,我们之前提交的版本里面已经包含了些大文件了,虽然后来在新的提交里面删除了这些大文件,但是之前commit的记录还是存在,所以之后提交还是会失败1) 模拟一下环境:新建仓库并且添加一个 te…

ztree 标准得json数据格式_酷站推荐 - json-c.github.io/json-c - json-c API

json-c.github.io/json-c/http://json-c.github.io/json-c/JSON:JavaScript 对象表示法(JavaScript Object Notation)。 JSON 是存储和交换文本信息的语法。类似 XML。 JSON 比 XML 更小、更快,更易解析。JSON(JavaScript Object …

qt弹框输入密码_Android仿支付宝密码输入框

实现效果图:实现流程:1、定义6位密码输入View思路:要绘制边框矩形,绘制分割线,绘制圆点。绘制圆的数目要与字符串的长度有关,添加或者删除都要修改字符串,输入6位后就是要关闭弹框,拿…

esc指令检查打印状态_Z.115 胶片自助打印设备

一、概述病人在完成影像检查后,需要快速获取结果,传统的方式是向病人发放胶片和诊断报告,随着大型医院病人检查量的快速增加,这种方式有诸多弊病。自助打印机将胶片和诊断报告打印集成起来,消除时空障碍,实…

java执行class找不到main函数_你所不知道的HelloWorld背后的执行原理

专注于Java领域优质技术,欢迎关注作者:饭谈编程【今日最佳】对于程序员而言,所谓的二八定律指的是 花百分之八十的时间去学习日常研发中不常见的那百分之二十的原理。据说阿里某程序员对书法十分感兴趣,退休后决定在这方面有所建树…

java接口文档生成工具_【分享】接口文档生成工具apipost

一、为什么要写接口文档?正规的团队合作或者是项目对接,接口文档是非常重要的,一般接口文档都是通过开发人员写的。一个工整的文档显得是非重要。项目开发过程中前后端工程师有一个统一的文件进行沟通交流开发,项目维护中或者项目…

jacobi matlab程序,jacobi迭代法实验MATLAB程序数值分析

jacobi迭代法实验MATLAB程序数值分析 例1. 求线性方程组 得近似解。精确解为x*[3,2,1]’。 解:对方程进行移项就得 记为Axb,或写为xB0 xf,其中 取初始值,代入原方程组可得再将把它代入可得.反复利用这个计算过程,得到一向量序列和…

java 水印乱码,linux java程序加水印及中文乱码方案

在linux,centos环境下的,生成的带文字的水印图片在显示为方框乱码。img.setFont(new Font("宋体", Font.BOLD, 20));写中文进入图片之前必须设置字体,而且这个字体必须支持中文,否则就会出现乱码或者方框、问号等等。Bu…

resultmap拿不到数据_阿里巴巴国际站每日电商运营工作数据表格

一、日常运营工作表1.数据日报统计每天的流量数据:2.数据周报统计每周的流量数据:3.数据月报统计每月流量数据:前半部分后半部分4.P4P月数据总览统计P4P的流量数据:大图包含上面所有的方案5.P4P日数据总览6.爆款数据统计每月统计爆…

jenkins ssh 远程部署_Jenkins部署jar到远程服务器

首选得确定Jenkins的安装完整,还有插件的安装,除默认插件,此处必备插件:Publish Over SSH,SSH plugin,因为我源码在gitlab所以关于gitlab的插件我也安装了,看各自的情况选择安装。然后到系统管理…

jieba分词_Jieba.el – 在Emacs中使用jieba中文分词

jieba.el在Emacs中使用jieba中文分词众所周知, Emacs并没有内置中文分词系统, 以至于 forward-word 和 backward-word 以及 kill-word 等以单词为单位的操作只能粗暴的标点符号进行确定所谓”词汇”, (其实是中文里的句子).jieba.el 利用nodejieba对buffer中的中文句子进行分割…

java php 女生数量,萌妹子告诉你php和java如何选

原标题:萌妹子告诉你php和java如何选phpPHP 独特的语法混合了C、Java、Perl 以及 PHP 自创新的语法。它可以比 CGI 或者 Perl 更快速的执行动态网页PHP具有非常强大的功能,所有的CGI的功能PHP都能实现,而且支持几乎所有流行的数据库以及操作系…

new 结构体指针_Go:我应该用指针替代结构体的副本吗?

logo对于许多 golang 开发者来说,考虑到性能,最佳实践是系统地使用指针而非结构体副本。我们将回顾两个用例,来理解使用指针而非结构体副本的影响。1. 数据分配密集型让我们举一个简单的例子,说明何时要为使用值而共享结构体&…

localstorage存储大小_Cookie 已凉,Web 存储该这么做!

本文经授权转自公众号CSDN(ID:CSDNnews)作者 | 浪里行舟责编 | 郭芮随着移动网络的发展与演化,我们手机上现在除了有原生 App,还能跑“WebApp”——它即开即用,用完即走。一个优秀的 WebApp 甚至可以拥有和原生 App 媲美的功能和体…