blog.csdn.net/weixin_5065…
指令
import { nextTick } from 'vue'
export const draggable = {
async mounted(el, binding) {
await nextTick()
const dialogHeaderEl = el.querySelector('.ant-modal-header')
const dragDom = el.querySelector('.ant-modal')
dialogHeaderEl.style.cssText += ';cursor:move;'
const sty = (function () {
return (dom, attr) => getComputedStyle(dom, null)[attr]
})()
dialogHeaderEl.addEventListener('mousedown', (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')
if (styL === 'auto') styL = '0px'
let styT = sty(dragDom, 'top')
if (styL.includes('%')) {
styL = Number(document.body.clientWidth) * (Number(styL.replace(/%/g, '')) / 100)
styT = Number(document.body.clientHeight) * (Number(styT.replace(/%/g, '')) / 100)
} else {
styL = Number(styL.replace(/px/g, ''))
styT = Number(styT.replace(/px/g, ''))
}
const fn = (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.addEventListener('mousemove', fn)
document.addEventListener('mouseup', (e) => {
document.removeEventListener('mousemove', fn)
})
return false
})
},
}
注册指令
import { draggable } from './directives/draggable'
app.directive('draggable', draggable)
使用指令
<div ref='modalBox' v-draggable>
<a-modal
v-model:open='visible' title='编辑' ok-text='保存'
:get-container='() => $refs.modalBox'
:force-render='true'
@ok='onSave'
>
</a-modal>
</div>