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实现仿新浪微博获取文本框能输入的字数代码
Feb 22 Javascript
jquery实现背景墙聚光灯效果示例分享
Mar 02 Javascript
Javascript中拼接大量字符串的方法
Feb 05 Javascript
详解AngularJS中的依赖注入机制
Jun 17 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
Jul 22 Javascript
AngularJs  Using $location详解及示例代码
Sep 02 Javascript
初识简单却不失优雅的Vue.js
Sep 12 Javascript
JavaScript中 DOM操作方法小结
Apr 25 Javascript
深入探究angular2 UI组件之primeNG用法
Jul 26 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
Mar 06 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
Jul 12 jQuery
vue相关配置文件详解及多环境配置详细步骤
May 19 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+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
javascript工具库代码
2012/03/29 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
jQuery中slice()方法用法实例
2015/01/07 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
vue组件实例解析
2017/01/10 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
使用grappelli为django admin后台添加模板
2014/11/18 Python
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
Python中操作符重载用法分析
2016/04/29 Python
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
python爬取微信公众号文章的方法
2019/02/26 Python
python实现画循环圆
2019/11/23 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
英国工具中心:UK Tool Centre
2017/07/10 全球购物
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
农业资源与环境专业自荐信范文
2013/12/30 职场文书
电气工程自动化求职信
2014/03/14 职场文书
建筑院校毕业生求职信
2014/06/13 职场文书
安全生产学习心得体会
2016/01/18 职场文书