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 相关文章推荐
清华大学出版的事半功倍系列 javascript全部源代码
May 04 Javascript
Jquery练习之表单验证实现代码
Dec 14 Javascript
仿猪八戒网左下角的文字滚动效果
Oct 28 Javascript
js导出格式化的excel 实例方法
Jul 17 Javascript
jQuery中parents()和parent()的区别分析
Oct 28 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
May 30 Javascript
js将滚动条滚动到指定位置的简单实现方法
Jun 25 Javascript
使用Angular自定义字段校验指令的方法示例
Feb 01 Javascript
vue中多个倒计时实现代码实例
Mar 27 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
Aug 20 Javascript
Nest.js环境变量配置与序列化详解
Feb 21 Javascript
vue组件的路由高亮问题解决方法
May 11 Vue.js
原生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
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
php实现图片上传时添加文字和图片水印技巧
2020/04/18 PHP
PHP数据分析引擎计算余弦相似度算法示例
2017/08/08 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
eval与window.eval的差别分析
2011/03/17 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
2014/06/03 Javascript
利用a标签自动解析URL分析网址实例
2014/10/20 Javascript
js闭包的用途详解
2014/11/09 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
学习Node.js模块机制
2016/10/17 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
Python 私有函数的实例详解
2017/09/11 Python
基于python 爬虫爬到含空格的url的处理方法
2018/05/11 Python
python创建文件备份的脚本
2018/09/11 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
对Django外键关系的描述
2019/07/26 Python
python pillow模块使用方法详解
2019/08/30 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
美国领先的在线邮轮旅游公司:CruiseDirect
2018/06/07 全球购物
获奖的大学生创业计划书
2014/01/05 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
学习退步检讨书
2014/09/28 职场文书
综合素质自我评价评语
2015/03/06 职场文书
西柏坡观后感
2015/06/08 职场文书
期中考试后的感想
2015/08/07 职场文书