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

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 15:40:42
字體:
來源:轉載
供稿:網友

 小白我用的是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;   };  };  } } }            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 梁河县| 望谟县| 莎车县| 曲水县| 天门市| 鸡西市| 章丘市| 泸定县| 盐山县| 石景山区| 集贤县| 平邑县| 乐昌市| 义乌市| 三亚市| 蒙阴县| 台北市| 南木林县| 望江县| 搜索| 衡南县| 泰兴市| 五原县| 南澳县| 沛县| 民权县| 祁阳县| 吉水县| 修文县| 永寿县| 江达县| 班戈县| 阜宁县| 曲水县| 延吉市| 萝北县| 二连浩特市| 盱眙县| 上高县| 河津市| 台安县|