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 相关文章推荐
客户端静态页面玩分页
Jun 26 Javascript
js 浮动层菜单收藏
Jan 16 Javascript
iphone safari不支持position fixed的解决方法
May 04 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
Mar 26 Javascript
jQuery+Ajax实现限制查询间隔的方法
Jun 07 Javascript
js 自带的sort() 方法全面了解
Aug 16 Javascript
js实现页面刷新滚动条位置不变
Nov 27 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
Apr 22 Javascript
解决vue跨域axios异步通信问题
Apr 17 Javascript
QML实现圆环颜色选择器
Sep 25 Javascript
js实现二级联动简单实例
Jan 11 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
Jul 24 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设计模式 Template (模板模式)
2011/06/26 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
js脚本获取webform服务器控件的方法
2014/05/16 Javascript
JavaScript函数详解
2015/02/27 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
JavaScript实现矩形块大小任意缩放
2020/08/25 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
2020/10/29 Javascript
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
pytorch中的inference使用实例
2020/02/20 Python
python有几个版本
2020/06/17 Python
医院实习接收函
2014/01/12 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
历史学专业求职信
2014/06/19 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
2014年妇女工作总结
2014/12/06 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
如何使用python包中的sched事件调度器
2022/04/30 Python