【无标题】亲测有效,拖拽js,完美拖拽,无bug,vuetify中拖拽dialog

亲测有效,拖拽js,完美拖拽,无bug,vuetify中拖拽dialog

有一个弹框拖拽需求,用的ui库是vuetify,但是ui库本身是不支持拖拽的,此时又需要支持拖拽,以下代码就派上用场了

首先,建一个draggable.js文件

// draggable.js
// 拖拽
function draggable() {
  const d = {}
  document.addEventListener('mousedown', (e) => {
    const closestDialog = e.target.closest('.v-dialog.v-dialog--active')
    if (e.button === 0 && closestDialog != null && e.target.classList.contains('v-card__title')) {
      // element which can be used to move element
      d.el = closestDialog // element which should be moved
      d.mouseStartX = e.clientX
      d.mouseStartY = e.clientY
      d.elStartX = d.el.getBoundingClientRect().left
      d.elStartY = d.el.getBoundingClientRect().top
      d.el.style.position = 'fixed'
      d.el.style.margin = 0
      d.oldTransition = d.el.style.transition
      d.el.style.transition = 'none'
    }
  })
  document.addEventListener('mousemove', (e) => {
    if (d.el === undefined) return
    d.el.style.left =
      Math.min(
        Math.max(d.elStartX + e.clientX - d.mouseStartX, 0),
        window.innerWidth - d.el.getBoundingClientRect().width,
      ) + 'px'
    d.el.style.top =
      Math.min(
        Math.max(d.elStartY + e.clientY - d.mouseStartY, 0),
        window.innerHeight - d.el.getBoundingClientRect().height,
      ) + 'px'
  })
  document.addEventListener('mouseup', () => {
    if (d.el === undefined) return
    d.el.style.transition = d.oldTransition
    d.el = undefined
  })
}

// 防止越界
function preventBounds() {
  timer = setInterval(() => {
    // prevent out of bounds
    const dialog = document.querySelector('.v-dialog.v-dialog--active')
    if (dialog === null) return
    dialog.style.left =
      Math.min(
        parseInt(dialog.style.left),
        window.innerWidth - dialog.getBoundingClientRect().width,
      ) + 'px'
    dialog.style.top =
      Math.min(
        parseInt(dialog.style.top),
        window.innerHeight - dialog.getBoundingClientRect().height,
      ) + 'px'
  }, 100)
}

export { draggable, preventBounds }

再在需要用到的页面中引入

import { draggable } from '@/utils/draggable.js'
mounted() {
   // 使弹框可以拖拽
   draggable()
},

弹框就可以拖拽啦,preventBounds函数暂时没有用到,可以自行看情况调用

如果页面上有很多弹框,但是只想其中一个可以拖拽,怎么办呢

<v-dialog content-class="move-dialog">

给dialiog设置一个单独的类名,并修改draggable.js文件

const closestDialog = e.target.closest('.v-dialog.v-dialog--active.move-dialog')

只修改这一行就可以,把单独的类名加进去,现在就可以单独拖拽某一个弹框了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值