el-dialog实现可拖拽
Vue Directive申明:
Vue.directive('dragglable', { bind(el) { // 获取弹窗头部元素 const dialogHeaderEl = el.querySelector(".el-dialog__header"); // 获取整个弹窗元素 const dragDom = el.querySelector(".el-dialog"); dialogHeaderEl.style.cursor = "move"; dialogHeaderEl.onmousedown = (e) => { // 计算鼠标相对弹窗头部的偏移量 const disX = e.clientX - dialogHeaderEl.offsetLeft; const disY = e.clientY - dialogHeaderEl.offsetTop; // 获取可视区域的宽高 const screenWidth = document.body.clientWidth; const screenHeight = document.body.clientHeight; const dragDomWidth = dragDom.offsetWidth; const dragDomHeight = dragDom.offsetHeight; // 计算可移动范围的边界值 const minDragDomLeft = dragDom.offsetLeft; const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth; const minDragDomTop = dragDom.offsetTop; const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight; // 用于存储弹窗的位置信息 let styL, styT; if (window.getComputedStyle(dragDom).left.includes("%")) { styL = +document.body.clientWidth * ( + window.getComputedStyle(dragDom).left.replace(/%/g, "") / 100); styT = +document.body.clientHeight * ( + window.getComputedStyle(dragDom).top.replace(/%/g, "") / 100); } else { styL = +window.getComputedStyle(dragDom).left.replace(/px/g, ""); styT = +window.getComputedStyle(dragDom).top.replace(/px/g, ""); } document.onmousemove = function(e) { let left = e.clientX - disX; let top = e.clientY - disY; if ( - left > minDragDomLeft) { left = -minDragDomLeft; } else if (left > maxDragDomLeft) { left = maxDragDomLeft; } if ( - top > minDragDomTop) { top = -minDragDomTop; } else if (top > maxDragDomTop) { top = maxDragDomTop; } dragDom.style.cssText += `;left: ${ left + styL }px;top: ${ top + styT }px;`; }; // 清除鼠标移动和松开事件的监听 document.onmouseup = function() { document.onmousemove = null; document.onmouseup = null; }; }; } });