const draggable = {
install (Vue) {
Vue.directive('drag', {
inserted (el, binding) {
if (window.Element && !Element.prototype.closest) {
Element.prototype.closest = function (s) {
const matches = (this.document || this.ownerDocument).querySelectorAll(s)
let i
let el = this
do {
i = matches.length
} while (i < 0 && (el = el.parentElement))
return el
}
}
let overWin = false
if (binding.value) {
overWin = binding.value.over || false
}
const moveTitle = el.parentNode.parentNode.parentNode.querySelector('.ant-modal-header')
el.style.width = '100%'
el.style.height = moveTitle.offsetHeight + 'px'
el.style.position = 'absolute'
el.style.left = 0
el.style.top = 0
el.style.cursor = 'move'
const odiv = el
const moveDom = el.closest('.ant-modal')
odiv.onmousedown = e => {
const moveDomLeft = moveDom.offsetLeft
const moveDomTop = moveDom.offsetTop
const moveDomW = moveDom.offsetWidth
const moveDomH = moveDom.offsetHeight
const winWidth = document.body.clientWidth
const winHeight = document.body.clientHeight
moveDom.style.position = 'absolute'
moveDom.style.top = moveDomTop + 'px'
moveDom.style.left = moveDomLeft + 'px'
const disX = e.clientX
const disY = e.clientY
document.onmousemove = e => {
const left = e.clientX - disX
const top = e.clientY - disY
let toMoveTop = 0
let toMoveLeft = 0
if (!overWin) {
if (moveDomTop + top + moveDomH > winHeight) {
toMoveTop = winHeight - moveDomH
} else if (moveDomTop + top < 0) {
} else {
toMoveTop = moveDomTop + top
}
if (moveDomLeft + left < 0) {
} else if (moveDomLeft + left + moveDomW > winWidth) {
toMoveLeft = winWidth - moveDomW
} else {
toMoveLeft = moveDomLeft + left
}
} else {
toMoveTop = moveDomTop + top
toMoveLeft = moveDomLeft + left
}
moveDom.style.top = toMoveTop + 'px'
moveDom.style.left = toMoveLeft + 'px'
}
document.onmouseup = () => {
document.onmousemove = null
document.onmouseup = null
}
}
}
})
}
}
export default draggable