1
0
mirror of https://github.com/PanJiaChen/vue-element-admin.git synced 2025-08-10 12:01:57 +08:00

Merge 3444eb04a379c8cd269de6c176c3e5f70666b3cc into 6858a9ad67483025f6a9432a926beb9327037be3

This commit is contained in:
lu 2024-10-24 21:20:27 +08:00 committed by GitHub
commit f3e099d8fd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -14,10 +14,37 @@ export default {
} }
})() })()
dialogHeaderEl.onmousedown = (e) => { const handleDialogMouseMove = (e, sty = { left: 0, top: 0 }, dis = { x: 0, y: 0 }, dragDomBoundary = { minDragDomTop: 0, maxDragDomTop: 0, minDragDomLeft: 0, maxDragDomLeft: 0 }) => {
// 通过事件委托,计算移动的距离
let left = e.clientX - dis.x
let top = e.clientY - dis.y
// 边界处理
if (-(left) > dragDomBoundary.minDragDomLeft) {
left = -dragDomBoundary.minDragDomLeft
} else if (left > dragDomBoundary.maxDragDomLeft) {
left = dragDomBoundary.maxDragDomLeft
}
if (-(top) > dragDomBoundary.minDragDomTop) {
top = -dragDomBoundary.minDragDomTop
} else if (top > dragDomBoundary.maxDragDomTop) {
top = dragDomBoundary.maxDragDomTop
}
// 移动当前元素
dragDom.style.cssText += `;left:${left + sty.left}px;top:${top + sty.top}px;`
// emit onDrag event
vnode.child.$emit('dragDialog')
}
dialogHeaderEl.addEventListener('mousedown', (e) => {
// 鼠标按下,计算当前元素距离可视区的距离 // 鼠标按下,计算当前元素距离可视区的距离
const disX = e.clientX - dialogHeaderEl.offsetLeft const dis = {
const disY = e.clientY - dialogHeaderEl.offsetTop x: e.clientX - dialogHeaderEl.offsetLeft,
y: e.clientY - dialogHeaderEl.offsetTop
}
const dragDomWidth = dragDom.offsetWidth const dragDomWidth = dragDom.offsetWidth
const dragDomHeight = dragDom.offsetHeight const dragDomHeight = dragDom.offsetHeight
@ -25,53 +52,38 @@ export default {
const screenWidth = document.body.clientWidth const screenWidth = document.body.clientWidth
const screenHeight = document.body.clientHeight const screenHeight = document.body.clientHeight
const minDragDomLeft = dragDom.offsetLeft const dragDomBoundary = {
const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth minDragDomTop: dragDom.offsetTop,
maxDragDomTop: screenHeight - dragDom.offsetTop - dragDomHeight,
const minDragDomTop = dragDom.offsetTop minDragDomLeft: dragDom.offsetLeft,
const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight maxDragDomLeft: screenWidth - dragDom.offsetLeft - dragDomWidth
}
// 获取到的值带px 正则匹配替换 // 获取到的值带px 正则匹配替换
let styL = getStyle(dragDom, 'left') const sty = {
let styT = getStyle(dragDom, 'top') left: getStyle(dragDom, 'left'),
top: getStyle(dragDom, 'top')
}
if (styL.includes('%')) { if (sty.left.includes('%')) {
styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100) sty.left = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100)
styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100) sty.top = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100)
} else { } else {
styL = +styL.replace(/\px/g, '') sty.left = +sty.left.replace(/\px/g, '')
styT = +styT.replace(/\px/g, '') sty.top = +sty.top.replace(/\px/g, '')
} }
document.onmousemove = function(e) { // 事件委托
// 通过事件委托,计算移动的距离 const mouseMoveEventListenerSignal = new AbortController()
let left = e.clientX - disX document.addEventListener('mousemove', (e) => {
let top = e.clientY - disY handleDialogMouseMove(e, sty, dis, dragDomBoundary)
}, { signal: mouseMoveEventListenerSignal.signal })
// 边界处理 const mouseUpEventListenerSignal = new AbortController()
if (-(left) > minDragDomLeft) { document.addEventListener('mouseup', () => {
left = -minDragDomLeft mouseMoveEventListenerSignal.abort()
} else if (left > maxDragDomLeft) { mouseUpEventListenerSignal.abort()
left = maxDragDomLeft }, { signal: mouseUpEventListenerSignal.signal })
} })
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
}
}
} }
} }