vue全局自定义指令-元素拖拽的实现代码


Posted in Javascript onApril 14, 2019

 小白我用的是vue-cli的全家桶,在标签中加入v-drap则实现元素拖拽, 全局指令我是写在main.js中

Vue.directive('drag', {
 inserted: function (el) {
  el.onmousedown=function(ev){
   var disX=ev.clientX-el.offsetLeft;
   var disY=ev.clientY-el.offsetTop;
   document.onmousemove=function(ev){
    var l=ev.clientX-disX;
    var t=ev.clientY-disY;
    el.style.left=l+'px';
    el.style.top=t+'px';
   };
   document.onmouseup=function(){
    document.onmousemove=null;
    document.onmouseup=null;

   };
  };
 }

})

后面肯定要补充放大缩小功能,和把定位,宽度信息保留到vuex中的state中

pS:下面看下面板拖拽之vue自定义指令,具体内容如下所述:

前言

在指令里获取的this并不是vue对象,vnode.context才是vue对象,一般来说,指令最好不要访问vue上的data,以追求解耦,但是可以通过指令传进来的值去访问method或ref之类的。

vue指令

官方文档其实已经解释的蛮清楚了,这里挑几个重点的来讲。

1 arguments

el: 当前的node对象,用于操作dom

binding:模版解析之后的值

vNode: Vue 编译生成的虚拟节点,可以在上面获取vue对象

oldVnode: 使用当前指令上一次变化的node内容

2。 生命周期

bind: 初始化的时候调用,但这时候node不一定渲染完成

inserted: 被绑定元素插入父节点时调用,关于dom操作尽量在这里用

update:就是内部this.update时会触发这里

面板拖拽逻辑

使用relative,舰艇event上的clientX和clientY鼠标距离页面的位置来改变面板的top和left。

涉及属性

offsetLeft:距离参照元素左边界偏移量
offsetTop:距离参照元素上边界偏移量
clientWidth:此属性可以返回指定元素客户区宽度
clientHeight: 此属性可以返回指定元素客户区高度
clientX:事件被触发时鼠标指针相对于浏览器页面(或客户区)的水平坐标
clientY: 事件被触发时鼠标指针相对于浏览器页面(或客户区)的垂直坐标
onmousedown:鼠标按下事件
onmousemove: 鼠标滑动事件
onmouseup: 鼠标松开事件

实现代码

<div v-drag="'refName'"></div>

在绑定的组件上使用,value非必选项,不挑就默认是基于document的移动

directives: {
 drag: {
  // 使用bind会有可能没有渲染完成
  inserted: function(el, binding, vnode) {
  const _el = el; //获取当前元素
  const ref = vnode.context.$refs[binding.value]; // 判断基于移动的是哪一个盒子
  const masterNode = ref ? ref : document; // 用于绑定事件
  const masterBody = ref ? ref : document.body; // 用于获取高和宽
  const mgl = _el.offsetLeft;
  const mgt = _el.offsetTop;
  const maxWidth = masterBody.clientWidth;
  const maxHeight = masterBody.clientHeight;
  const elWidth = _el.clientWidth;
  const elHeight = _el.clientHeight;
  let positionX = 0,
   positionY = 0;
  _el.onmousedown = e => {
   //算出鼠标相对元素的位置,加上的值是margin的值
   let disX = e.clientX - _el.offsetLeft + mgl; 
   let disY = e.clientY - _el.offsetTop + mgt;
   masterNode.onmousemove = e => {
   //用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
   let left = e.clientX - disX;
   let top = e.clientY - disY;
   // 绑定的值不能滑出基于盒子的范围
   left < 0 && (left = 0);
   left > (maxWidth - elWidth - mgl) && (left = maxWidth - elWidth - mgl);
   top < 0 && (top = 0);
   top > (maxHeight - elHeight - mgt) && (top = maxHeight - elHeight - mgt);
   //绑定元素位置到positionX和positionY上面
   positionX = top;
   positionY = left;
   
   //移动当前元素
   _el.style.left = left + "px";
   _el.style.top = top + "px";
   };
   // 这里是鼠标超出基于盒子范围之后再松开,会监听不到
   document.onmouseup = e => {
   masterNode.onmousemove = null;
   document.onmouseup = null;
   };
  };
  }
 }
 }

总结

以上所述是小编给大家介绍的面板拖拽之vue自定义指令实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
传递参数的标准方法(jQuery.ajax)
Nov 19 Javascript
Javascript 构造函数 实例分析
Nov 26 Javascript
js字符串转换成xml对象并使用技巧解读
Apr 18 Javascript
jQuery中:first选择器用法实例
Dec 30 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
Mar 10 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
Mar 23 Javascript
为什么JS中eval处理JSON数据要加括号
Apr 13 Javascript
浅析BootStrap Treeview的简单使用
Oct 12 Javascript
javascript中replace使用方法总结
Mar 01 Javascript
基于AngularJS的简单使用详解
Sep 10 Javascript
vue脚手架中配置Sass的方法
Jan 04 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
Mar 07 Javascript
vue自定义指令之面板拖拽的实现
Apr 14 #Javascript
详解Vue组件之间通信的七种方式
Apr 14 #Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
Apr 14 #Javascript
vue使用axios上传文件(FormData)的方法
Apr 14 #Javascript
详解如何理解vue的key属性
Apr 14 #Javascript
axios+Vue实现上传文件显示进度功能
Apr 14 #Javascript
Vue 使用formData方式向后台发送数据的实现
Apr 14 #Javascript
You might like
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
PHP 八种基本的数据类型小结
2011/06/01 PHP
php检测文件编码的方法示例
2014/04/25 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
PHP可变变量学习小结
2015/11/29 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
javascript中使用正则计算中文长度的例子
2014/04/29 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
Bootstrap整体框架之JavaScript插件架构
2016/12/15 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
树结构之JavaScript
2017/01/24 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
2014/11/19 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
大学生专业个人学习的自我评价
2013/10/26 职场文书
护理个人求职信范文
2014/01/08 职场文书
社区学雷锋活动策划方案
2014/01/30 职场文书
法定代表人授权委托书
2014/04/04 职场文书
产品推广策划方案
2014/05/10 职场文书
煤矿安全生产标语
2014/06/06 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
党员读书活动心得体会
2016/01/14 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书