vue element el-dialog 自定义指令实现拖拽、双击全屏

Vue.directive('drag', {
    bind (el) {
      const header = el.querySelector('.el-dialog__header')
      const elDialog = el.querySelector('.el-dialog')
      let isFullScreen = false
      let originalHeight = 0
      let originalWidth = 0
      let originalLeft = 0
      let originalTop = 0
      let originalMarginTop = 0
      header.style.cursor = 'move'
      let mouseDown = (e) => {
        e.preventDefault()
        // 算出鼠标相对元素的位置
        let disX = e.clientX - elDialog.offsetLeft
        let disY = e.clientY - elDialog.offsetTop

        const elDialogWidth = elDialog.offsetWidth
        const elDialogHeight = elDialog.offsetHeight

        const screenWidth = document.body.clientWidth
        const screenHeight = document.body.clientHeight

        const maxLeft = screenWidth - elDialogWidth

        const maxTop = screenHeight - elDialogHeight

        el.onmousemove = (e) => {
          e.preventDefault()
          // 用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
          let left = e.clientX - disX
          let top = e.clientY - disY

          // 边界检测
          if (left > maxLeft) {
            left = maxLeft
          } else if (-left > 0) {
            left = 0
          }

          if (top > maxTop) {
            top = maxTop
          } else if (-top > 0) {
            top = 0
          }

          // 移动当前元素
          elDialog.style.left = left + 'px'
          elDialog.style.top = top + 'px'
          elDialog.style.margin = 0
          elDialog.style.marginTop = 0
        }
        el.onmouseup = (e) => {
          e.preventDefault()
          el.onmousemove = null
          el.onmouseup = null
        }
      }
      header.onmousedown = mouseDown
      header.ondblclick = (e) => {
        if (!isFullScreen) {
          originalHeight = elDialog.clientHeight
          originalWidth = elDialog.clientWidth
          originalLeft = elDialog.style.left
          originalTop = elDialog.style.top
          originalMarginTop = elDialog.style.marginTop
          elDialog.style.height = '100vh'
          elDialog.style.width = '100vw'
          elDialog.style.left = 0
          elDialog.style.top = 0
          elDialog.style.marginTop = 0
          header.style.cursor = 'pointer'
          header.onmousedown = null
          isFullScreen = true
        } else {
          elDialog.style.height = originalHeight + 'px'
          elDialog.style.width = originalWidth + 'px'
          elDialog.style.left = originalLeft
          elDialog.style.top = originalTop
          elDialog.style.marginTop = originalMarginTop
          header.style.cursor = 'move'
          header.onmousedown = mouseDown
          isFullScreen = false
        }
      }
    }
  })
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值