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 相关文章推荐
拖动Html元素集合 Drag and Drop any item
Dec 22 Javascript
JavaScript 直接操作本地文件的实现代码
Dec 01 Javascript
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
Mar 23 Javascript
jquery.jstree 增加节点的双击事件代码
Jul 27 Javascript
jQuery版Tab标签切换
Mar 16 Javascript
Jquery实现由下向上展开效果的例子
Dec 08 Javascript
利用jQuery实现打字机字幕效果实例代码
Sep 02 Javascript
微信小程序 地图map实例详解
Jun 07 Javascript
7个好用的JavaScript技巧分享(译)
May 07 Javascript
js 实现 list转换成tree的方法示例(数组到树)
Aug 18 Javascript
sharp.js安装过程中遇到的问题总结
Apr 02 Javascript
js简单实现自动生成表格功能示例
Jun 02 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
thinkphp 框架数据库切换实现方法分析
2020/05/18 PHP
Jquery replace 字符替换实现代码
2010/12/02 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
js中this的用法实例分析
2015/01/10 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
Python下使用Psyco模块优化运行速度
2015/04/05 Python
Python素数检测的方法
2015/05/11 Python
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
Python中__init__.py文件的作用详解
2016/09/18 Python
Python实现统计代码行的方法分析
2017/07/12 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
TensorFlow实现卷积神经网络
2018/05/24 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
python读取并写入mat文件的方法
2019/07/12 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
解决Jupyter无法导入已安装的 module问题
2020/04/17 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
双十佳事迹材料
2014/01/29 职场文书
清华大学自主招生自荐信
2014/01/29 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python