博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
el-dialog 模态框拖拽
阅读量:5946 次
发布时间:2019-06-19

本文共 3215 字,大约阅读时间需要 10 分钟。

1.拖拽效果

1.1 拖拽前
image.png
1.2 拖拽后
image.png

2.拖拽组件。

把代码单独拷贝在一个js里即可,这里写在公共文件夹common/js/directives.js里,具体看步骤3示例。
参考API 的Vue.directive。

import Vue from 'vue';// v-dialogDrag: 弹窗拖拽属性 (重点!!! 给模态框添加这个属性模态框就能拖拽了)Vue.directive('dialogDrag', { //属性名称dialogDrag,前面加v- 使用  bind(el, binding, vnode, oldVnode) {    const dialogHeaderEl = el.querySelector('.el-dialog__header');    const dragDom = el.querySelector('.el-dialog');    //dialogHeaderEl.style.cursor = 'move';    dialogHeaderEl.style.cssText += ';cursor:move;'    dragDom.style.cssText += ';top:0px;'    // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);    const sty = (function() {      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 = 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;      };    }  }})

3.拖拽组件的引入,只要引入了directives.js即可

3.1引入

import '../common/js/directives.js'

3.2示例

image.png

4.使用。

给el-dialog添加属性v-dialogDrag即可
image.png
代码:

确定
取消

参考:

转载地址:http://jqbxx.baihongyu.com/

你可能感兴趣的文章
有序的双链表
查看>>
程序员全国不同地区,微信(面试 招聘)群。
查看>>
【干货】界面控件DevExtreme视频教程大汇总!
查看>>
闭包 !if(){}.call()
查看>>
python MySQLdb安装和使用
查看>>
Java小细节
查看>>
poj - 1860 Currency Exchange
查看>>
chgrp命令
查看>>
Java集合框架GS Collections具体解释
查看>>
洛谷 P2486 BZOJ 2243 [SDOI2011]染色
查看>>
linux 笔记本的温度提示
查看>>
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
深入理解Java的接口和抽象类
查看>>
java与xml
查看>>
Javascript异步数据的同步处理方法
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>