当前位置:首页 > VUE

vue实现卡片拖动

2026-01-18 10:57:27VUE

Vue 实现卡片拖动的几种方法

使用 HTML5 拖放 API

HTML5 提供了原生的拖放 API,可以在 Vue 中直接使用。通过 draggable 属性标记可拖动的元素,并监听 dragstartdragoverdrop 事件来实现拖放功能。

<template>
  <div 
    v-for="(item, index) in items" 
    :key="index"
    draggable="true"
    @dragstart="handleDragStart(index)"
    @dragover.prevent
    @drop="handleDrop(index)"
  >
    {{ item }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3'],
      draggedIndex: null
    };
  },
  methods: {
    handleDragStart(index) {
      this.draggedIndex = index;
    },
    handleDrop(index) {
      const draggedItem = this.items[this.draggedIndex];
      this.items.splice(this.draggedIndex, 1);
      this.items.splice(index, 0, draggedItem);
    }
  }
};
</script>

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,提供了更简单的拖放实现方式。安装后可以直接在模板中使用。

npm install vuedraggable
<template>
  <draggable v-model="items" @end="onDragEnd">
    <div v-for="(item, index) in items" :key="index">
      {{ item }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3']
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖放完成');
    }
  }
};
</script>

使用自定义拖拽逻辑

对于更复杂的拖拽需求,可以结合鼠标事件(mousedownmousemovemouseup)实现自定义拖拽逻辑。这种方式灵活性更高,但实现起来相对复杂。

<template>
  <div 
    v-for="(item, index) in items" 
    :key="index"
    class="draggable-item"
    @mousedown="startDrag(index, $event)"
  >
    {{ item }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3'],
      isDragging: false,
      draggedIndex: null,
      startY: 0
    };
  },
  methods: {
    startDrag(index, event) {
      this.isDragging = true;
      this.draggedIndex = index;
      this.startY = event.clientY;
      document.addEventListener('mousemove', this.onDrag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    onDrag(event) {
      if (!this.isDragging) return;
      const y = event.clientY;
      const deltaY = y - this.startY;
      // 根据 deltaY 计算拖拽位置并更新 UI
    },
    stopDrag() {
      this.isDragging = false;
      document.removeEventListener('mousemove', this.onDrag);
      document.removeEventListener('mouseup', this.stopDrag);
    }
  }
};
</script>

<style>
.draggable-item {
  cursor: grab;
  user-select: none;
}
</style>

使用拖拽库 interact.js

interact.js 是一个轻量级的拖拽库,支持更高级的拖拽功能(如限制拖拽范围、吸附等)。结合 Vue 使用可以实现复杂的拖拽交互。

npm install interactjs
<template>
  <div 
    v-for="(item, index) in items" 
    :key="index"
    class="draggable-item"
    ref="dragItem"
  >
    {{ item }}
  </div>
</template>

<script>
import interact from 'interactjs';

export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3']
    };
  },
  mounted() {
    interact(this.$refs.dragItem)
      .draggable({
        onmove: (event) => {
          const target = event.target;
          const x = (parseFloat(target.style.left) || 0) + event.dx;
          const y = (parseFloat(target.style.top) || 0) + event.dy;
          target.style.left = `${x}px`;
          target.style.top = `${y}px`;
        }
      });
  }
};
</script>

总结

  • HTML5 拖放 API:适合简单的拖放需求,无需额外依赖。
  • Vue.Draggable:基于 Sortable.js,适合列表排序等常见场景。
  • 自定义拖拽逻辑:灵活性高,适合复杂交互。
  • interact.js:功能强大,支持高级拖拽特性。

根据项目需求选择合适的实现方式。

vue实现卡片拖动

标签: 拖动卡片
分享给朋友:

相关文章

vue怎么实现拖动数据

vue怎么实现拖动数据

Vue 实现拖动数据的方法 使用 HTML5 拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件实现拖动功能。 <template> &…

vue 实现拖动

vue 实现拖动

Vue 实现拖动的几种方法 在Vue中实现拖动功能可以通过多种方式,包括原生HTML5的拖放API、第三方库如vuedraggable等。以下是几种常见的实现方法: 使用HTML5拖放API HT…

vue 实现卡片拖动

vue 实现卡片拖动

Vue 实现卡片拖动的几种方法 使用 Vue 实现卡片拖动可以通过多种方式实现,以下是几种常见的方法: 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 d…

vue怎么实现拖动数据

vue怎么实现拖动数据

实现拖动数据的基本方法 在Vue中实现拖动数据通常使用HTML5的拖放API或第三方库如vuedraggable。以下是两种常见方法的详细说明: 使用HTML5原生拖放API HTML5提供了dr…

vue实现拖动

vue实现拖动

Vue 实现拖动的几种方法 使用 HTML5 原生拖放 API HTML5 提供了原生拖放 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dro…

uniapp 卡片效果

uniapp 卡片效果

uniapp 实现卡片效果的方法 使用 view 和 CSS 样式 通过 view 组件结合 CSS 样式可以快速实现卡片效果。设置圆角、阴影和边距来增强视觉层次感。 <view class…