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 相关文章推荐
解决AJAX中跨域访问出现'没有权限'的错误
Aug 20 Javascript
createElement动态创建HTML对象脚本代码
Nov 24 Javascript
Prototype Object对象 学习
Jul 12 Javascript
jquery tab标签页的制作
May 10 Javascript
js控制分页打印、打印分页示例
Feb 08 Javascript
jquery获取当前元素索引值用法实例
Jun 10 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
Jan 12 Javascript
微信小程序 出现47001 data format error原因解决办法
Mar 10 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
Aug 24 Javascript
基于iScroll实现内容滚动效果
Mar 21 Javascript
微信小程序之onLaunch与onload异步问题详解
Mar 28 Javascript
CountUp.js实现数字滚动增值效果
Oct 17 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动态生成静态HTML网页的代码
2010/03/04 PHP
linux实现php定时执行cron任务详解
2013/12/24 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
Javascript window对象详解
2014/11/12 Javascript
BootStrap Table 设置height表头与内容无法对齐的问题
2016/12/28 Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
vue-element-admin 菜单标签失效的解决方式
2019/11/12 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
原生js实现分页效果
2020/09/23 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
Python正则表达式指南 推荐
2018/10/09 Python
python学习--使用QQ邮箱发送邮件代码实例
2019/04/16 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
医学生实习自荐信
2013/10/01 职场文书
厂办主管岗位职责范本
2014/02/28 职场文书
热门专业求职信
2014/05/24 职场文书
中文专业自荐书
2014/06/29 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
搞笑婚庆主持词
2015/06/29 职场文书
严以律己学习心得体会
2016/01/13 职场文书
调解协议书范本
2016/03/21 职场文书
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js
python实现双向链表原理
2022/05/25 Python