el-dialog拖拽

Vue.directive('dialogDrag', {
            bind(el, binding, vnode, oldVnode) {
              
                const dialogHeaderEl = el.querySelector('.el-dialog__header')
                const dragDom = el.querySelector('.el-dialog')
                
                dialogHeaderEl.style.cursor = 'move'
                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 styleLeftStr = getComputedStyle(dragDom).left
                    const styleTopStr = getComputedStyle(dragDom).top
                    if (!styleLeftStr || !styleTopStr) return
                    let styleLeft
                    let styleTop
                    if (styleLeftStr.includes('%')) {
                        styleLeft = +document.body.clientWidth * (+styleLeftStr.replace(/%/g, '') / 100)
                        styleTop = +document.body.clientHeight * (+styleTopStr.replace(/%/g, '') / 100)
                    } else {
                        styleLeft = +styleLeftStr.replace(/px/g, '')
                        styleTop = +styleTopStr.replace(/px/g, '')
                    }
              
                    document.onmousemove = (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 + styleLeft}px;top:${top + styleTop}px;`
                    }
              
                    document.onmouseup = () => {
                        document.onmousemove = null
                        document.onmouseup = null
                    }
                }
            }
        })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zero0985

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值