vue实现element-ui对话框可拖拽功能


Posted in Javascript onAugust 17, 2018

element-ui对话框可拖拽及边界处理

应业务需求,需要实现对话框可拖拽问题,应element-ui没有提供官方支持,于是便参考大神的文章,得出了适合业务需要的解决方案。很多大神给出的代码是没有解决边界问题的,但是不解决边界问题存在一个bug,拖到不可视区域后边再也拖不回来了,不信你们可以试试。

在实现的功能的情况下,封装成了js文件,然后再main.js中引入后可全局使用。

还是上代码吧

功能实现代码directives.js代码如下:

import Vue from 'vue';
 
// 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.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;
      };
    } 
  }
})

在边界处理上,因为在我的项目中无法获取到body的高度(被这个折磨了好久),所以采取了获取可见区域高度,这里补充点知识

document.body.clientWidth //BODY对象宽度
document.body.clientHeight //BODY对象高度
document.documentElement.clientWidth //可见区域宽度
document.documentElement.clientHeight //可见区域高度

在main.js中引入

// 引入Dialog可拖拽,注意文件所在目录。目前尚未发现引入的先后关系,若有再补充
import './directives.js';

ue文件中使用:

在el-dialog标签中加入v-dialogDrag属性

<el-dialog v-dialogDrag></el-dialog>

具体使用便是这样,希望有人看到哈哈哈,当然主要还是想帮到大家。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
May 06 Javascript
一个关于javascript匿名函数的问题分析
Mar 30 Javascript
提交表单时执行func方法实现代码
Mar 17 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
Dec 20 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
Aug 26 Javascript
JavaScript生成带有缩进的表格代码
Jun 15 Javascript
jquery事件绑定解绑机制源码解析
Sep 19 Javascript
微信小程序 wxapp内容组件 icon详细介绍
Oct 31 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
Dec 13 Javascript
js封装成插件的步骤方法
Sep 11 Javascript
微信小程序适配iphoneX的实现方法
Sep 18 Javascript
学习node.js 断言的使用详解
Mar 18 Javascript
原生JS实现的简单轮播图功能【适合新手】
Aug 17 #Javascript
layer.confirm取消按钮绑定事件的方法
Aug 17 #Javascript
LayerClose弹窗关闭刷新方法
Aug 17 #Javascript
详解vue移动端项目的适配(以mint-ui为例)
Aug 17 #Javascript
layui前端框架之table表数据的刷新方法
Aug 17 #Javascript
Vue登录注册并保持登录状态的方法
Aug 17 #Javascript
小程序清理本地缓存的方法
Aug 17 #Javascript
You might like
PHP实现显示照片exif信息的方法
2014/07/11 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
2016/12/25 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
javascript全局变量封装模块实现代码
2012/11/28 Javascript
网页整体变灰白色(兼容各浏览器)实例
2013/04/21 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
2018/12/20 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
Selenium鼠标与键盘事件常用操作方法示例
2018/08/13 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
python 中不同包 类 方法 之间的调用详解
2020/03/09 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
Lookfantastic阿联酋官网:英国知名美妆护肤购物网站
2020/05/26 全球购物
中间件分为哪几类
2012/03/14 面试题
儿科护士实习自我鉴定
2013/10/17 职场文书
经理职责范文
2013/11/08 职场文书
应届大学毕业生找工作的求职信范文
2013/11/29 职场文书
海飞丝广告词
2014/03/20 职场文书
银行贷款承诺书
2014/03/29 职场文书
初中生期末评语大全
2014/04/24 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
大二学年个人总结
2015/03/03 职场文书
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
Python中基础数据类型 set集合知识点总结
2021/08/02 Python
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android
mysql中关键词exists的用法实例详解
2022/06/10 MySQL
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript