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 相关文章推荐
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
May 07 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
Aug 23 Javascript
分享十五款 jQuery 社交网络分享插件
May 16 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
Dec 02 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
Dec 11 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
Feb 04 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
Feb 22 Javascript
bootstrap table表格使用方法详解
Apr 26 Javascript
微信小程序页面开发注意事项整理
May 18 Javascript
vue中promise的使用及异步请求数据的方法
Nov 08 Javascript
弱类型语言javascript中 a,b 的运算实例小结
Aug 07 Javascript
一篇文章看懂JavaScript中的回调
Jan 05 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实现单例模式最安全的做法
2014/06/13 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
jQuery DOM操作小结与实例
2010/01/07 Javascript
JavaScript移除数组元素减少长度的方法
2013/09/05 Javascript
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
js中获取 table节点各tr及td的内容简单实例
2016/10/14 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
vue-music关于Player播放器组件详解
2017/11/28 Javascript
关于JavaScript中高阶函数的魅力详解
2018/09/07 Javascript
Python判断直线和矩形是否相交的方法
2015/07/14 Python
Python将图片批量从png格式转换至WebP格式
2020/08/22 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
python下载图片实现方法(超简单)
2017/07/21 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
详解Python中pyautogui库的最全使用方法
2020/04/01 Python
Python 中如何写注释
2020/08/28 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
求职信需要的五点内容
2014/02/01 职场文书
共产党员承诺书
2014/03/25 职场文书
校长竞聘演讲稿
2014/05/16 职场文书
php引用传递
2021/04/01 PHP
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫
python装饰器代码解析
2022/03/23 Python