vue3中用css transform实现组件自由拖拽

在Vue 3中,可以使用CSS transform 和 mousedown、mousemove、mouseup 事件来实现组件的自由拖拽。以下是一个简单的例子,展示如何使用这些技术来实现组件的自由拖拽。

1. 创建一个Vue 3组件

首先,创建一个Vue 3组件(例如,Draggable.vue),并添加模板、样式和脚本。

<template>
  <div
    class="draggable"
    :style="style"
    @mousedown="startDrag"
  >
    Drag Me
  </div>
</template>

<script>
import { ref, onMounted, onBeforeUnmount } from 'vue';

export default {
  setup() {
    const x = ref(0);
    const y = ref(0);
    const isDragging = ref(false);
    const initialX = ref(0);
    const initialY = ref(0);
    const style = ref({});

    const startDrag = (event) => {
      isDragging.value = true;
      initialX.value = event.clientX - x.value;
      initialY.value = event.clientY - y.value;

      document.addEventListener('mousemove', drag);
      document.addEventListener('mouseup', stopDrag);
    };

    const drag = (event) => {
      if (isDragging.value) {
        x.value = event.clientX - initialX.value;
        y.value = event.clientY - initialY.value;
        style.value = {
          transform: `translate(${x.value}px, ${y.value}px)`,
        };
      }
    };

    const stopDrag = () => {
      isDragging.value = false;
      document.removeEventListener('mousemove', drag);
      document.removeEventListener('mouseup', stopDrag);
    };

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

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

    return {
      style,
      startDrag,
    };
  },
};
</script>

<style scoped>
.draggable {
  width: 100px;
  height: 100px;
  background-color: #42b983;
  cursor: grab;
  position: absolute;
  user-select: none;
}
</style>

2. 解释

  • 模板 (template): 组件的HTML结构是一个 div,并绑定了 @mousedown 事件来启动拖拽。style 是一个动态绑定的样式对象,用于更新位置。

  • 脚本 (script):

    • ref 用于创建响应式变量。
    • startDrag 函数在鼠标按下时触发,记录初始位置并绑定 mousemove 和 mouseup 事件。
    • drag 函数在鼠标移动时触发,更新组件位置。
    • stopDrag 函数在鼠标松开时触发,解除事件绑定。
  • 样式 (style): 为组件设置基本样式,使其可见并提供拖拽视觉效果。

3. 使用

可以在你的Vue 3应用中直接使用这个组件,像这样:

<template>
  <div>
    <Draggable />
  </div>
</template>

<script>
import Draggable from './components/Draggable.vue';

export default {
  components: {
    Draggable,
  },
};
</script>

这个例子展示了如何使用CSS transform 和事件处理在Vue 3中实现一个简单的拖拽功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天天进步2015

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

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

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

打赏作者

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

抵扣说明:

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

余额充值