vue3弹框拖拽功能

发布于:2025-02-10 ⋅ 阅读:(103) ⋅ 点赞:(0)

 

<div  @mousedown="startDrag">
    
  </div>
import { useDrag } from '@/views/WholeNetworkNewView/components/3D/BaseStationPanel/useDrag.js'

const { startDrag } = useDrag()
import { ref, onMounted, onBeforeUnmount } from 'vue'

export function useDrag() {
  const isDragging = ref(false)
  const offset = ref({ x: 0, y: 0 })
  const modal = ref(null)
  let zIndexCounter = 1000 // 初始 z-index 值

  const startDrag = (e) => {
    const targetId = e.currentTarget.id
    //const targetId = e.target.id
    if (targetId) {
      isDragging.value = true
      offset.value.x = e.clientX - e.currentTarget.offsetLeft
      offset.value.y = e.clientY - e.currentTarget.offsetTop
      modal.value = e.currentTarget // 动态设置 modal 为当前拖拽的元素
      zIndexCounter += 1
      modal.value.style.zIndex = zIndexCounter // 设置 z-index 使其置顶
    }
  }

  const onMouseMove = (e) => {
    // 如果正在拖动并且模态框存在
    if (isDragging.value && modal.value) {
      // 更新模态框的left样式,使其跟随鼠标移动
      modal.value.style.left = `${e.clientX - offset.value.x}px`
      // 更新模态框的top样式,使其跟随鼠标移动
      modal.value.style.top = `${e.clientY - offset.value.y}px`
    }
  }

  const stopDrag = () => {
    isDragging.value = false
  }

  onMounted(() => {
    document.addEventListener('mousemove', onMouseMove)
    document.addEventListener('mouseup', stopDrag)
  })

  onBeforeUnmount(() => {
    document.removeEventListener('mousemove', onMouseMove)
    document.removeEventListener('mouseup', stopDrag)
  })

  return {
    startDrag
  }
}

 

 

 

 


网站公告

今日签到

点亮在社区的每一天
去签到