当前位置: 首页 > Web前端 > vue.js

通过自定义指令实现可拖动对话框

时间:2023-03-31 21:56:52 vue.js

1.写一个util.jsimportVuefrom"vue"Vue.directive('dialogDrag',{bind(el,binding,vnode,oldVnode){//弹框可以拉伸最小宽高letminWidth=400;letminHeight=300;//初始非全屏letisFullScreen=false;//当前宽高letnowWidth=0;letnowHeight=0;//当前顶部高度letnowMarginTop=0;//获取头部弹框(这部分可以双击全屏)constdialogHeaderEl=el.querySelector('.el-dialog__header');//弹窗constdragDom=el.querySelector('.el-dialog');//给弹窗添加overflowauto;否则收缩frame内标签可能超出dialog;dragDom.style.overflow="auto";//清除选择header文本的效果//dialogHeaderEl.onselectstart=newFunction("returnfalse");//在header中添加一个可拖动的光标dom元素,空);conststy=dragDom.currentStyle||window.getComputedStyle(dragDom,null);letmoveDown=(e)=>{//当鼠标按下时,计算当前元素到可见区域的距离constdisX=e.clientX-dialogHeaderEl.offsetLeft;constdisY=e.clientY-dialogHeaderEl.offsetTop;//获取的值替换为px正则匹配letstyL,styT;//注意ie中第一次获取的值是组件本身的50%,移动后赋值给pxif(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){//通过事件委托,计算移动距离constl=e.clientX-disX;constt=e.clientY-disY;//移动当前元素dragDom.style.left=`${l+styL}px`;dragDom.style.top=`${t+styT}px`;//发送当前位置//绑定。价值({x:e.pageX,y:e.pageY})};document.onmouseup=function(e){document.onmousemove=null;文档.onmouseup=null;};}dialogHeaderEl.onmousedown=moveDown;//双击头部全屏效果dialogHeaderEl.ondblclick=(e)=>{if(isFullScreen==false){nowHight=dragDom.clientHeight;nowWidth=dragDom.clientWidth;nowMarginTop=dragDom.style.marginTop;dragDom.style.left=0;dragDom.style.top=0;dragDom.style.height="100VH";dragDom.style.width="100VW";dragDom.style.marginTop=0;isFullScreen=true;dialogHeaderEl.style.cursor='初始';dialogHeaderEl.onmousedown=null;}else{dragDom.style.height="auto";dragDom.style.width=nowWidth+'px';dragDom.style.marginTop=nowMarginTop;isFullScreen=false;dialogHeaderEl.style.cursor='移动';dialogHeaderEl.onmousedown=moveDown;}}dragDom.onmousemove=function(e){让moveE=e;如果(e.clientX>dragDom.offsetLeft+dragDom.clientWidth-10||dragDom.offsetLeft+10>e.clientX){dragDom.style.cursor='w-resize';}elseif(el.scrollTop+e.clientY>dragDom.offsetTop+dragDom.clientHeight-10){dragDom.style.cursor='s-resize';}else{dragDom.style.cursor='default';拖动域。onmousedown=null;}dragDom.onmousedown=(e)=>{constclientX=e.clientX;constclientY=e.clientY;让elW=dragDom.clientWidth;让elH=dragDom.clientHeight;让EloffsetLeft=dragDom.offsetLeft;让EloffsetTop=dragDom.offsetTop;dragDom.style.userSelect='无';让ELscrollTop=el.scrollTop;//判断点击的位置是否为头部if(clientX>EloffsetLeft&&clientXEloffsetTop&&clientYEloffsetLeft&&clientXe.clientX){dragDom.style.width=elW+(clientX-e.clientX)*2+'像素';}//向右拖动if(clientXEloffsetLeft+elW-10&&clientXe.clientX){if(dragDom.clientWidthEloffsetTop+elH-20&&ELscrollTop+clientYe.clientY){if(dragDom.clientHeight点击打开对话框