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 相关文章推荐
js数组的操作详解
Mar 27 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
Apr 23 Javascript
基于 Node.js 实现前后端分离
Apr 23 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
Jun 08 Javascript
jQuery加载及解析XML文件的方法实例分析
Jan 22 Javascript
浅谈Vue父子组件和非父子组件传值问题
Aug 22 Javascript
微信小程序实现即时通信聊天功能的实例代码
Aug 17 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
May 28 Javascript
JavaScript中七种流行的开源机器学习框架
Oct 11 Javascript
iView框架问题整理小结
Oct 16 Javascript
详解elementui之el-image-viewer(图片查看器)
Aug 30 Javascript
VsCode里的Vue模板的实现
Aug 12 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获取文件扩展名的4种方法
2015/11/24 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
PHP基于SPL实现的迭代器模式示例
2018/04/22 PHP
JavaScript 加号(+)运算符号
2009/12/06 Javascript
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
webpack 1.x升级过程中的踩坑总结大全
2017/08/09 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
vue axios数据请求及vue中使用axios的方法
2018/09/10 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
python判断windows隐藏文件的方法
2014/03/21 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
Python之reload流程实例代码解析
2018/01/29 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
物业管理计划书
2014/01/10 职场文书
部队万能检讨书
2014/02/20 职场文书
股权转让意向书
2014/04/01 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
医院党建工作总结2015
2015/05/26 职场文书
焦点访谈观后感
2015/06/11 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
python如何做代码性能分析
2021/04/26 Python
Python使用Kubernetes API访问集群
2021/05/30 Python
python多线程方法详解
2022/01/18 Python
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫