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简单实现幻灯片的方法
Aug 03 Javascript
详解JavaScript对象序列化
Jan 19 Javascript
深入浅出ES6之let和const命令
Aug 25 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
Oct 05 Javascript
JS插件plupload.js实现多图上传并显示进度条
Nov 29 Javascript
vue-cli如何引入bootstrap工具的方法
Oct 19 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
Nov 27 Javascript
vue 2.x 中axios 封装的get 和post方法
Feb 28 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
Aug 28 Javascript
在vue中使用express-mock搭建mock服务的方法
Nov 07 Javascript
vue组件化中slot的基本使用方法
May 01 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
Sep 26 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 Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
PHP PDOStatement::errorInfo讲解
2019/01/31 PHP
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
2013/07/08 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
常见的jQuery选择器汇总
2014/11/24 Javascript
JavaScript中的alert()函数使用技巧详解
2014/12/29 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
2019/04/30 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
Python中实现结构相似的函数调用方法
2015/03/10 Python
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
pandas计数 value_counts()的使用
2019/06/24 Python
python手写均值滤波
2020/02/19 Python
css3实现可滑动跳转的分页插件示例
2014/05/08 HTML / CSS
家长给幼儿园的表扬信
2014/01/09 职场文书
函授本科自我鉴定
2014/02/04 职场文书
2014年预备党员学习两会心得体会
2014/03/17 职场文书
2014光棍节大学生联谊活动方案
2014/10/10 职场文书
MySQL性能压力基准测试工具sysbench的使用简介
2021/04/21 MySQL
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL