记录简单实用的vue拖拽元素指令
// 绑定事件
function _addEvent(el, eventName, fn){if(document.addEventListener){el.addEventListener(eventName, fn, false);}else if(window.attachEvent){el.attactEvent('on' + eventName, fn);}
};
// 解绑事件
function _offEvent(el, eventName, fn){if(document.removeEventListener){el.removeEventListener(eventName, fn, false);}else if(window.detachEvent){el.detachEvent('on' + eventName, fn);}
};
export default {bind(el, binding, vnode) {if(!binding.value.dragElSelector){console.error('需传递拖拽元素的选择器,参数名:dragElSelector')return;}if(binding.value.useDrag === false){return;}const dialogHeaderEl = el.querySelector(binding.value.dragElSelector);const dragDom = el;// 是否使用边界,如果使用边界则元素不会被拖出窗口const useBoundary = binding.value.useBoundary !== false;const onDrag = binding.value.onDrag;dialogHeaderEl.style.cssText += ';cursor:move;';// 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);const getStyle = (function() {if (window.document.currentStyle) {return (dom, attr) => dom.currentStyle[attr]} else {return (dom, attr) => getComputedStyle(dom, false)[attr]}})()let mouseDownEvent = (e) => {// console.log(e.clientX, e.clientY)// console.log(vnode); // 鼠标按下,计算当前元素距离可视区的距离const disX = e.clientX - dialogHeaderEl.offsetLeftconst disY = e.clientY - dialogHeaderEl.offsetTopconst dragDomWidth = dragDom.offsetWidthconst dragDomHeight = dragDom.offsetHeightconst screenWidth = document.body.clientWidth || window.innerWidthconst screenHeight = document.body.clientHeight || window.innerHeightconst minDragDomLeft = dragDom.offsetLeftconst maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidthconst minDragDomTop = dragDom.offsetTopconst maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight