当前位置:首页 > VUE

vue 实现卡片拖拽

2026-01-08 08:30:06VUE

Vue 实现卡片拖拽

使用 HTML5 原生拖拽 API

HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstartdragenddragoverdrop 事件实现拖拽功能。

<template>
  <div class="card" draggable="true" @dragstart="handleDragStart" @dragend="handleDragEnd">
    {{ cardContent }}
  </div>
  <div class="drop-area" @dragover.prevent @drop="handleDrop"></div>
</template>

<script>
export default {
  data() {
    return {
      cardContent: '拖拽我',
    };
  },
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', this.cardContent);
    },
    handleDragEnd() {
      console.log('拖拽结束');
    },
    handleDrop(e) {
      const data = e.dataTransfer.getData('text/plain');
      console.log('拖拽数据:', data);
    },
  },
};
</script>

<style>
.card {
  width: 100px;
  height: 100px;
  background: #ccc;
  cursor: move;
}
.drop-area {
  width: 200px;
  height: 200px;
  background: #f0f0f0;
}
</style>

使用第三方库 Vue.Draggable

Vue.Draggable 是基于 Sortable.js 的 Vue 拖拽组件,适用于列表拖拽排序。

安装依赖:

npm install vuedraggable

示例代码:

<template>
  <draggable v-model="cards" @end="onDragEnd">
    <div v-for="card in cards" :key="card.id" class="card">
      {{ card.content }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable';
export default {
  components: { draggable },
  data() {
    return {
      cards: [
        { id: 1, content: '卡片1' },
        { id: 2, content: '卡片2' },
        { id: 3, content: '卡片3' },
      ],
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽后的顺序:', this.cards);
    },
  },
};
</script>

<style>
.card {
  width: 100px;
  height: 100px;
  background: #ccc;
  margin: 5px;
  cursor: move;
}
</style>

使用自定义拖拽逻辑

如果需要更灵活的拖拽控制,可以结合鼠标事件(mousedownmousemovemouseup)实现自定义拖拽。

<template>
  <div class="card" @mousedown="startDrag" :style="cardStyle">
    {{ cardContent }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      cardContent: '拖拽我',
      isDragging: false,
      offsetX: 0,
      offsetY: 0,
      posX: 0,
      posY: 0,
    };
  },
  computed: {
    cardStyle() {
      return {
        left: `${this.posX}px`,
        top: `${this.posY}px`,
      };
    },
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.offsetX = e.clientX - this.posX;
      this.offsetY = e.clientY - this.posY;
      document.addEventListener('mousemove', this.drag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    drag(e) {
      if (this.isDragging) {
        this.posX = e.clientX - this.offsetX;
        this.posY = e.clientY - this.offsetY;
      }
    },
    stopDrag() {
      this.isDragging = false;
      document.removeEventListener('mousemove', this.drag);
      document.removeEventListener('mouseup', this.stopDrag);
    },
  },
};
</script>

<style>
.card {
  width: 100px;
  height: 100px;
  background: #ccc;
  position: absolute;
  cursor: move;
}
</style>

注意事项

  • 使用原生拖拽 API 时,需注意浏览器兼容性。
  • Vue.Draggable 适用于列表排序,支持动画和触摸设备。
  • 自定义拖拽逻辑更灵活,但需要处理更多细节(如边界限制、碰撞检测)。

vue 实现卡片拖拽

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

相关文章

vue实现拖拽

vue实现拖拽

Vue 实现拖拽功能的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。在 Vue 中可以通过绑定这些事件来实现…

vue拖拽实现方式

vue拖拽实现方式

Vue 拖拽实现方式 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件(如 dragstart、dragend、dragover、…

vue实现拖拽连接

vue实现拖拽连接

Vue 实现拖拽连接功能 在 Vue 中实现拖拽连接功能通常涉及使用 HTML5 的拖放 API 或第三方库(如 vuedraggable)。以下是两种常见实现方式: 使用 HTML5 拖放 API…

vue实现拖拽div

vue实现拖拽div

实现拖拽功能的基本思路 在Vue中实现拖拽功能可以通过HTML5的拖拽API或第三方库如vuedraggable来完成。以下是两种常见方法的详细说明: 使用HTML5拖拽API HTML5提供了原…

vue 实现拖拽甘特图

vue 实现拖拽甘特图

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

vue实现carousel拖拽

vue实现carousel拖拽

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