国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue全局自定義指令-元素拖拽的實現代碼

2019-11-19 11:47:12
字體:
來源:轉載
供稿:網友

 小白我用的是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自定義指令實例詳解,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九江县| 土默特左旗| 蛟河市| 通山县| 涪陵区| 承德县| 宾阳县| 阳谷县| 吴江市| 纳雍县| 嘉义县| 怀柔区| 沽源县| 张家口市| 双城市| 桦川县| 双鸭山市| 通许县| 新田县| 平乐县| 抚松县| 乾安县| 长葛市| 铁岭县| 特克斯县| 博兴县| 夏邑县| 开阳县| 闻喜县| 依兰县| 兰坪| 和顺县| 隆子县| 湟中县| 周至县| 荆州市| 礼泉县| 巴青县| 平和县| 潜江市| 社旗县|