1
0
mirror of https://github.com/PanJiaChen/vue-element-admin.git synced 2025-08-07 18:25:45 +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 disY = e.clientY - dialogHeaderEl.offsetTop
const dis = {
x: e.clientX - dialogHeaderEl.offsetLeft,
y: e.clientY - dialogHeaderEl.offsetTop
}
const dragDomWidth = dragDom.offsetWidth
const dragDomHeight = dragDom.offsetHeight
@ -25,53 +52,38 @@ export default {
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 dragDomBoundary = {
minDragDomTop: dragDom.offsetTop,
maxDragDomTop: screenHeight - dragDom.offsetTop - dragDomHeight,
minDragDomLeft: dragDom.offsetLeft,
maxDragDomLeft: screenWidth - dragDom.offsetLeft - dragDomWidth
}
// 获取到的值带px 正则匹配替换
let styL = getStyle(dragDom, 'left')
let styT = getStyle(dragDom, 'top')
const sty = {
left: getStyle(dragDom, 'left'),
top: getStyle(dragDom, 'top')
}
if (styL.includes('%')) {
styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100)
styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100)
if (sty.left.includes('%')) {
sty.left = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100)
sty.top = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100)
} else {
styL = +styL.replace(/\px/g, '')
styT = +styT.replace(/\px/g, '')
sty.left = +sty.left.replace(/\px/g, '')
sty.top = +sty.top.replace(/\px/g, '')
}
document.onmousemove = function(e) {
// 通过事件委托,计算移动的距离
let left = e.clientX - disX
let top = e.clientY - disY
// 事件委托
const mouseMoveEventListenerSignal = new AbortController()
document.addEventListener('mousemove', (e) => {
handleDialogMouseMove(e, sty, dis, dragDomBoundary)
}, { signal: mouseMoveEventListenerSignal.signal })
// 边界处理
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
}
}
const mouseUpEventListenerSignal = new AbortController()
document.addEventListener('mouseup', () => {
mouseMoveEventListenerSignal.abort()
mouseUpEventListenerSignal.abort()
}, { signal: mouseUpEventListenerSignal.signal })
})
}
}