先看效果
一、编写directive
dialog-drag.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| export default { mounted(el) { const dialogHeaderEl = el.querySelector(".el-dialog__header"); const dragDom = el.querySelector(".el-dialog"); dialogHeaderEl.style.cssText += ";cursor:move;"; dragDom.style.cssText += ";top:0px;";
const sty = (function() { if (window.document.currentStyle) { return (dom, attr) => dom.currentStyle[attr]; } else { return (dom, attr) => getComputedStyle(dom, false)[attr]; } })();
dialogHeaderEl.onmousedown = e => { const disX = e.clientX - dialogHeaderEl.offsetLeft; const disY = e.clientY - dialogHeaderEl.offsetTop;
const screenWidth = document.body.clientWidth; const screenHeight = document.documentElement.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 = sty(dragDom, "left"); let styT = sty(dragDom, "top");
if (styL.includes("%")) { styL = +document.body.clientWidth * (+styL.replace(/%/g, "") / 100); styT = +document.body.clientHeight * (+styT.replace(/%/g, "") / 100); } else { styL = +styL.replace(/px/g, ""); styT = +styT.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; }; }; } };
|
二、注册directive
main.js
1 2 3 4 5 6 7 8 9 10
| import dialogDrag from "./directive/dialog-drag";
createApp(App) .use(store) .use(router) .directive("dialog-drag", dialogDrag) .use(ElementPlus) .mount("#app");
|
三、使用
在el-dialog外层div使用v-dialog-drag
,即可实现
1 2 3 4 5 6
| <template> <div v-dialog-drag> <el-dialog> <!-- your code --> </el-dialog> </template>
|