我们使用directives绑定一个拖拽(drag)事件

directives: {drag: {// 指令的定义bind: el => {let oDiv = eloDiv.onmousedown = (e) => {let disX = e.clientX - oDiv.offsetLeftlet disY = e.clientY - oDiv.offsetTopdocument.onmousemove = (e) => {let left = e.clientX - disXlet top = e.clientY - disYoDiv.style.left = left + 'px'oDiv.style.top = top + 'px'}document.onmouseup = (e) => {document.onmousemove = nulldocument.onmouseup = null}}}}
}

然后直接在需要拖拽的dialog上使用v-drag属性

<el-dialog title="dialog":visible.sync="dialogVisible"width="900px"v-drag><.../>
</el-dialog>

这里注意,因为拖拽的坐标都是直接按px计算的,所以如果dialog宽度使用百分比,拖拽时会导致dialog发生变形,需要使用固定宽度

下面还有一个全局配置dialog拖拽的方式,推荐使用以下方法:
建立directives.js文件

import Vue from 'vue';// v-dialogDrag: 弹窗拖拽属性
Vue.directive('drag', {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% 移动之后赋值为pxif (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 = function (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 = function (e) {document.onmousemove = null;document.onmouseup = null;};}}
})

main.js内引入

import './directives'

在需要使用的地方,直接使用v-drag属性即可

<el-dialog title="dialog":visible.sync="dialogVisible"v-drag><.../>
</el-dialog>

Vue:el-dialog可拖拽相关推荐

  1. vue+sortable实现表格拖拽

    vue+sortable实现表格拖拽 前言: 支持 vue3.0 支持表格拖拽 支持自定义拖拽 sortable官网 一.下载 sortable npm install sortablejs --sa ...

  2. Vue.Draggable 实现组件拖拽

    Vue.Draggable 实现组件拖拽 特性 支持触摸设备 支持拖拽和选择文本 支持智能滚动 支持不同列表之间的拖拽 不以jQuery为基础 和视图模型同步刷新 和vue2的国度动画兼容 支持撤销操 ...

  3. Android仿探探卡片拖拽,Vue 仿探探拖拽卡片的效果

    原标题:Vue 仿探探拖拽卡片的效果 已更新Vue3版,请给前端大全发送关键字vue3仿探探获取Vue3版 类似 Tinder 和 探探 的卡片效果的组件,社区中已经非常多了.我这一版除了可以实现和他 ...

  4. Vue+el-tree,元素拖拽时出现禁用图标, 请看解决办法

    项目需求:vue+el-tree实现节点拖拽到指定div播放视频: 问题:当节点拖拽时, 出现禁用图标: 一开始以为将禁用图标改变样式或隐藏就可以,一番尝试后, 发现这个图标可能是浏览器默认的, 经过 ...

  5. 基于 Spring Boot + Vue 实现的可视化拖拽编辑的大屏项目

    大家好,今天给小伙伴们分享一个基于 SpringBoot + Vue 实现的可视化拖拽编辑的大屏项目: 简介 这个是一个开源的一个BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑 ...

  6. vue+element弹窗可拖拽拉伸和弹窗内table高度自适应

    需求是这样的:需要将目前的el-dialog弹窗都改成可拉伸和拖拽的.并且做自适应.(一番交涉下来,最终是如果弹窗里面有table的话,我们给table的高度自适应,普通表单不需要). 确定了需求,准 ...

  7. sortable使用小知识(vue)-- 使用sortable拖拽插件在初始化循环标签的状态下,如何获取拖拽的数据

    废话 大家搜索这个基本都知道这个插件是干啥的,那我就不废话了.如果真的有人不晓得的话,点这个: sortable.js中文文档. 问题场景 当时产品拿着一个示例给我,我就要做成这样的. emmm,我看 ...

  8. vue 实现文本的拖拽_基于Vue实现拖拽功能

    本文实例为大家分享了Vue实现拖拽功能的具体代码,供大家参考,具体内容如下 效果图: HTML代码: 位置 x:{{val.x}} y:{{val.y}} //注意这里要通过指令绑定函数将当前元素的位 ...

  9. vue 实现文本的拖拽_Vue-实现简单拖拽(自定义属性)

    拖拽 *{ margin: 0; padding: 0; } #box{ background: red; width: 100px; height: 100px; position: absolut ...

最新文章

  1. 2017\National _C_C++_C\1.哥德巴赫分解
  2. net.sf.ezmorph.Morpher问题解决
  3. leader:你的代码太烂了我根本看不懂
  4. html表单input file,input标签type=file的文件上传
  5. JavaScript 基础(十三):Window对象
  6. 集群、分布式、集中式、伪分布式的概念与区别
  7. Linux电源管理-wakeup count
  8. 学习笔记(02):19年录制Zookeeper、Dubbo视频教程 微服务教程分布式教程 SpringBoot教程整合-传统互联网架构到分布式架构的架构演变...
  9. 笔记本电脑显示打印机服务器关闭,电脑打印机服务能设定自动关闭吗
  10. 用python在大麦网抢票_大麦网自动抢票工具
  11. 视频信号数字光纤传输 光纤传输让高清视频传输更简单
  12. 利用谷歌安全令牌(google authenticator)为服务器ssh添加二次验证功能
  13. 初识JavaScript
  14. 【洛谷 P3191】 [HNOI2007]紧急疏散EVACUATE(二分答案,最大流)
  15. css修改方框内容,CSS改变checkbox的方框及对勾的粗细
  16. pdf转图片可调整大小分辨率
  17. 思科VPLS解决方案
  18. 11个销售心理学方法,帮你搞定客户!
  19. 初识Android 制作一个简单的记账本
  20. 数学专业英语 -- 组合分析和数值分析

热门文章

  1. Python网络爬虫的概念和基本原理
  2. 动手组装一台 macbook pro 15寸(a1398模具,rmbp mjlq2/mjlt2)
  3. 语义分割论文:FastFCN:Rethinking Dilated Convolution in the Backbone for Semantic Segmentation(arxiv2019)
  4. 【Python】批量修改照片日期
  5. 机器学习 —— 支持向量机
  6. 多进程和多线程的使用场景
  7. java 413错误,413错误——线上bug历险记
  8. 那些程序员才懂的笑话
  9. C语言错误 error C2059
  10. Activity及其生命周期小结