当前位置:首页 > VUE

vue3拖拽实现

2026-01-22 06:54:13VUE

Vue3 拖拽实现方法

在Vue3中实现拖拽功能可以通过多种方式完成,包括原生HTML5拖拽API、第三方库如vuedraggable或自定义实现。以下是几种常见方法:

使用HTML5原生拖拽API

HTML5提供了原生的拖拽API,可以通过draggable属性和相关事件实现基础拖拽功能。

<template>
  <div 
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
  >
    拖拽元素
  </div>
</template>

<script setup>
const handleDragStart = (e) => {
  e.dataTransfer.setData('text/plain', '拖拽数据');
};

const handleDragEnd = (e) => {
  console.log('拖拽结束');
};
</script>

使用vuedraggable

vuedraggable是一个基于Sortable.js的Vue3拖拽库,适用于列表拖拽排序等场景。

安装:

npm install vuedraggable@next

使用示例:

<template>
  <draggable 
    v-model="list"
    @end="onDragEnd"
  >
    <div v-for="item in list" :key="item.id">
      {{ item.name }}
    </div>
  </draggable>
</template>

<script setup>
import { ref } from 'vue';
import draggable from 'vuedraggable';

const list = ref([
  { id: 1, name: 'Item 1' },
  { id: 2, name: 'Item 2' },
]);

const onDragEnd = () => {
  console.log('拖拽完成', list.value);
};
</script>

自定义拖拽实现

通过鼠标事件(mousedownmousemovemouseup)实现更灵活的拖拽逻辑。

<template>
  <div
    class="draggable-item"
    @mousedown="startDrag"
    :style="itemStyle"
  >
    自定义拖拽元素
  </div>
</template>

<script setup>
import { ref } from 'vue';

const isDragging = ref(false);
const startX = ref(0);
const startY = ref(0);
const offsetX = ref(0);
const offsetY = ref(0);

const itemStyle = ref({
  left: '0px',
  top: '0px',
});

const startDrag = (e) => {
  isDragging.value = true;
  startX.value = e.clientX;
  startY.value = e.clientY;
  window.addEventListener('mousemove', onDrag);
  window.addEventListener('mouseup', stopDrag);
};

const onDrag = (e) => {
  if (!isDragging.value) return;
  offsetX.value = e.clientX - startX.value;
  offsetY.value = e.clientY - startY.value;
  itemStyle.value = {
    left: `${offsetX.value}px`,
    top: `${offsetY.value}px`,
  };
};

const stopDrag = () => {
  isDragging.value = false;
  window.removeEventListener('mousemove', onDrag);
  window.removeEventListener('mouseup', stopDrag);
};
</script>

拖拽与动画结合

使用Vue的过渡动画(<transition>)或CSS动画增强拖拽体验。

vue3拖拽实现

<template>
  <draggable v-model="list" @end="onDragEnd">
    <transition-group name="list">
      <div v-for="item in list" :key="item.id" class="item">
        {{ item.name }}
      </div>
    </transition-group>
  </draggable>
</template>

<style>
.list-enter-active,
.list-leave-active {
  transition: all 0.5s ease;
}
.list-enter-from,
.list-leave-to {
  opacity: 0;
  transform: translateY(30px);
}
</style>

注意事项

  1. 移动端适配:若需支持移动端,需处理touchstarttouchmovetouchend事件。
  2. 性能优化:对于大量拖拽元素,建议使用虚拟滚动(如vue-virtual-scroller)。
  3. 无障碍访问:为拖拽元素添加aria-*属性以支持屏幕阅读器。

以上方法可根据实际需求选择或组合使用。

标签: 拖拽
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

vue 实现拖拽甘特图

vue 实现拖拽甘特图

实现拖拽甘特图的核心思路 Vue 实现拖拽甘特图需要结合第三方库或自定义逻辑,核心功能包括任务条渲染、时间轴刻度、拖拽交互、数据绑定等。以下是具体实现方法: 使用第三方库(推荐) vue-gantt…

vue实现carousel拖拽

vue实现carousel拖拽

实现拖拽轮播的基本思路 在Vue中实现可拖拽的Carousel组件需要结合触摸事件(touchstart、touchmove、touchend)和鼠标事件(mousedown、mousemove、mo…

jquery 拖拽

jquery 拖拽

jQuery 拖拽实现方法 使用 jQuery 实现拖拽功能可以通过多种方式完成,以下是常见的几种方法: 使用 jQuery UI 的拖拽功能 jQuery UI 提供了 draggable 方法,…

vue实现div拖拽

vue实现div拖拽

Vue 实现 Div 拖拽的方法 使用原生 HTML5 拖拽 API 在 Vue 中可以通过 HTML5 的拖拽 API 实现基础拖拽功能。需要为元素添加 draggable 属性,并监听 drags…

vue实现tree拖拽

vue实现tree拖拽

Vue 实现 Tree 拖拽功能 使用 vue-draggable 库 vue-draggable 是基于 Sortable.js 的 Vue 拖拽组件库,适合实现树形结构的拖拽功能。 安装依赖:…