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 相关文章推荐
dojo 之基础篇(二)之从服务器读取数据
Mar 24 Javascript
JS图片预加载 JS实现图片预加载应用
Dec 03 Javascript
解决JS无法调用Controller问题的方法
Dec 31 Javascript
Js与Jq获取浏览器和对象值的方法
Mar 18 Javascript
原生JavaScript实现Ajax的方法
Apr 07 Javascript
js判断主流浏览器类型和版本号的简单实现代码
May 26 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
Oct 25 Javascript
VUE axios上传图片到七牛的实例代码
Jul 28 Javascript
echarts学习笔记之箱线图的分析与绘制详解
Nov 22 Javascript
面包屑导航详解
Dec 07 Javascript
Jquery让form表单异步提交代码实现
Nov 14 jQuery
原生JavaScript实现弹幕组件的示例代码
Oct 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统计文章排行示例
2014/03/04 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
php+ajax简单实现全选删除的方法
2016/12/06 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
PHP children()函数讲解
2019/02/03 PHP
php实例化一个类的具体方法
2019/09/19 PHP
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
javascript使用递归算法求两个数字组合功能示例
2017/01/03 Javascript
微信小程序“摇一摇”的实例代码
2017/07/20 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
Python中一般处理中文的几种方法
2019/03/06 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
2020/09/21 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
Django drf请求模块源码解析
2021/06/08 Python
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python