vue自定义事件---拖拽
作者:互联网
margin布局拖拽
Vue.directive('drag', { bind(el, binding, vnode, oldVnode) { const dialogHeaderEl = el.querySelector('#top'); // const dragDom = el.querySelector('.alert_child'); dialogHeaderEl.style.cursor = 'move'; let dragBox = el; //获取当前元素 dialogHeaderEl.onmousedown = e => { //算出鼠标相对元素的位置 let disX = e.clientX - dragBox.offsetLeft; let disY = e.clientY - dragBox.offsetTop; document.onmousemove = e => { //用鼠标的位置减去鼠标相对元素的位置,得到元素的位置 let left = e.clientX - disX; let top = e.clientY - disY; //移动当前元素 dragBox.style.marginLeft = left + "px"; dragBox.style.marginTop = top + "px"; }; document.onmouseup = e => { //鼠标弹起来的时候不再移动 document.onmousemove = null; //预防鼠标弹起来后还会循环(即预防鼠标放上去的时候还会移动) document.onmouseup = null; }; }; } })
定位拖拽
Vue.directive('show_drag', { bind(el, binding, vnode, oldVnode) { const dialogHeaderEl = el.querySelector('.bt') || el.querySelector('.top') || el.querySelector('.header')||el.querySelector(".head"); const dragDom = el; dialogHeaderEl.style.cursor = 'move'; // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null); const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null); dialogHeaderEl.onmousedown = (e) => { // 鼠标按下,计算当前元素距离可视区的距离 const disX = e.clientX - dialogHeaderEl.offsetLeft; const disY = e.clientY - dialogHeaderEl.offsetTop; // 获取到的值带px 正则匹配替换 let styL, styT; // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px if (sty.left.includes('%')) { styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100); styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100); } else { styL = +sty.left.replace(/\px/g, ''); styT = +sty.top.replace(/\px/g, ''); }; document.onmousemove = function (e) { // 通过事件委托,计算移动的距离 var l = e.clientX < 50 || e.clientX > (document.body.clientWidth - 50) ? 0 : e.clientX - disX; var t = e.clientY < 50 || e.clientY > (document.body.clientHeight - 50) ? 0 : e.clientY - disY; // 移动当前元素 if (l) { dragDom.style.left = `${l + styL}px`; } if (t) { dragDom.style.top = `${t + styT}px`; } //将此时的位置传出去 //binding.value({x:e.pageX,y:e.pageY}) }; document.onmouseup = function (e) { document.onmousemove = null; document.onmouseup = null; }; } } })
标签:el,vue,const,自定义,px,top,dialogHeaderEl,document,拖拽 来源: https://www.cnblogs.com/yushihao/p/12011523.html