赞
踩
项目模板用的是vue-admin-element版本
里面有自带的拖拽方法
这个是上面复制下来的方法 dialogDrag.js
import Vue from 'vue' // v-dialogDrag: 弹窗拖拽属性 (重点!!! 给模态框添加这个属性模态框就能拖拽了) Vue.directive('dialogDrag', { // 属性名称dialogDrag,前面加v- 使用 bind(el, binding, vnode) { const dialogHeaderEl = el.querySelector('.el-dialog__header') const dragDom = el.querySelector('.el-dialog') dialogHeaderEl.style.cssText += ';cursor:move;' dragDom.style.cssText += ';top:0px;' // 获取原有属性 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] } })() dialogHeaderEl.onmousedown = (e) => { // 鼠标按下,计算当前元素距离可视区的距离 const disX = e.clientX - dialogHeaderEl.offsetLeft const disY = e.clientY - dialogHeaderEl.offsetTop const dragDomWidth = dragDom.offsetWidth // const dragDomHeight = dragDom.offsetHeight const screenWidth = document.body.clientWidth const screenHeight = document.body.clientHeight const minDragDomLeft = dragDom.offsetLeft const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth const minDragDomTop = dragDom.offsetTop // const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight const maxDragDomTop = screenHeight - dragDom.offsetTop// 不需要-dragDomHeight // 获取到的值带px 正则匹配替换 let styL = getStyle(dragDom, 'left') let styT = getStyle(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;` // emit onDrag event vnode.child.$emit('dragDialog') } document.onmouseup = function(e) { document.onmousemove = null document.onmouseup = null } } } })
在main.js引入就可以使用了 位置自行更改
import '@/utils/dialogDrag' // 全局dialog添加拖拽
在el-dialog上面添加v-dialogDrag就实现了拖拽效果
<el-dialog v-dialogDrag></el-dialog>
解决方法:就不解释了 简单直接 照抄就可以 替换dialogDrag.js的内容
import Vue from 'vue' // v-dialogDrag: 弹窗拖拽属性 (重点!!! 给模态框添加这个属性模态框就能拖拽了) Vue.directive('dialogDrag', { // 属性名称dialogDrag,前面加v- 使用 bind(el, binding, vnode) { const dialogHeaderEl = el.querySelector('.el-dialog__header') const dragDom = el.querySelector('.el-dialog') dialogHeaderEl.style.cssText += ';cursor:move;' dragDom.style.cssText += ';top:0px;' // 获取原有属性 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] } })() dialogHeaderEl.onmousedown = (e) => { // 鼠标按下,计算当前元素距离可视区的距离 const disX = e.clientX - dialogHeaderEl.offsetLeft const disY = e.clientY - dialogHeaderEl.offsetTop const dragDomWidth = dragDom.offsetWidth // const dragDomHeight = dragDom.offsetHeight const screenWidth = document.body.clientWidth const screenHeight = document.body.clientHeight const minDragDomLeft = dragDom.offsetLeft const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth const minDragDomTop = dragDom.offsetTop // const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight const maxDragDomTop = screenHeight - dragDom.offsetTop// 不需要-dragDomHeight // 获取到的值带px 正则匹配替换 let styL = getStyle(dragDom, 'left') let styT = getStyle(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;` // emit onDrag event vnode.child.$emit('dragDialog') } document.onmouseup = function(e) { document.onmousemove = null document.onmouseup = null } } } })
替换后就解决了问题
解决思路:很简单,点击全屏的时候设置位置恢复到默认即可
自行添加到方法里面
注意:防止影响到其他el-dialog
我们尽可能给el-dialog添加id
这里给到id是dragDialog
// 防止拖拽影响全屏 恢复到居中位置
this.$nextTick(() => {
const dialog = document.querySelector('#dragDialog .el-dialog')
dialog.style.left = '0'
dialog.style.top = '0'
})
注意!!!必须在同步情况,这里用到nextTick
如果有用,请给我点赞收藏,我会很开心,谢谢
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。