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 相关文章推荐
JScript中的&quot;this&quot;关键字使用方式补充材料
Mar 08 Javascript
javascript js cookie的存储,获取和删除
Dec 29 Javascript
仿迅雷焦点广告效果(JQuery版)
Nov 19 Javascript
jQuery插件开发全解析
Oct 10 Javascript
javascript显示用户停留时间的简单实例
Aug 05 Javascript
JavaScript instanceof 的使用方法示例介绍
Oct 23 Javascript
Node.js中require的工作原理浅析
Jun 24 Javascript
jquery实现的简单二级菜单效果代码
Sep 22 Javascript
基于jQuery实现Ajax验证用户名是否可用实例
Mar 25 jQuery
react MPA 多页配置详解
Oct 18 Javascript
Vue export import 导入导出的多种方式与区别介绍
Feb 12 Javascript
原生JS实现分页
Apr 19 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
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
js浮动图片的动态效果
2013/07/10 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
2014/05/14 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
详解用webpack2搭建angular2的项目
2017/06/22 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
维也纳通行证:Vienna PASS
2019/07/18 全球购物
夜大毕业生自我评价分享
2013/11/10 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
团购业务员岗位职责
2014/03/15 职场文书
留学生求职信
2014/06/03 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
写给女朋友的保证书
2015/05/09 职场文书
检察院起诉意见书
2015/05/20 职场文书
入党积极分子群众意见
2015/06/01 职场文书
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS