vue3实现拖拽效果

<template>
  <!-- 画布上方工具栏 -->
  <div class="top" ref="dragRef" @mousedown="startDrag">
    <!-- 其他内容保持不变 -->
  </div>
</template>

<script setup lang="ts">
// ... 其他已有的 imports ...
import { ref } from 'vue'

// ... 其他已有的代码 ...

// 拖拽相关
const dragRef = ref<HTMLElement | null>(null)
let isDragging = false
let currentX: number
let currentY: number
let initialX: number
let initialY: number

const startDrag = (e: MouseEvent) => {
  // 如果点击的是按钮或其子元素,不启动拖拽
  if ((e.target as HTMLElement).closest('button') || 
      (e.target as HTMLElement).closest('.a-trigger') ||
      (e.target as HTMLElement).closest('.a-tooltip')) {
    return
  }

  if (!dragRef.value) return
  
  isDragging = true
  initialX = e.clientX - dragRef.value.offsetLeft
  initialY = e.clientY - dragRef.value.offsetTop
  
  document.addEventListener('mousemove', drag)
  document.addEventListener('mouseup', stopDrag)
}

const drag = (e: MouseEvent) => {
  if (!isDragging || !dragRef.value) return
  
  e.preventDefault()
  currentX = e.clientX - initialX
  currentY = e.clientY - initialY
  
  dragRef.value.style.left = `${currentX}px`
  dragRef.value.style.top = `${currentY}px`
}

const stopDrag = () => {
  isDragging = false
  document.removeEventListener('mousemove', drag)
  document.removeEventListener('mouseup', stopDrag)
}
</script>

<style scoped>
.top {
  position: fixed; /* 改为 fixed */
  height: 30px;
  top: 10px;
  left: 10px;
  display: flex;
  align-items: center;
  z-index: 999; /* 提高 z-index */
  background-color: white;
  border-radius: 5px;
  box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
  padding: 0 10px;
  cursor: move; /* 添加移动光标 */
  user-select: none; /* 防止拖动时选中文本 */
}

/* ... 其他样式保持不变 ... */
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值