当前位置:首页 > 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 拖拽组件,适用于列表拖拽排序。

vue 实现卡片拖拽

安装依赖:

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中实现拖拽功能可以通过HTML5的拖放API或第三方库如vuedraggable来完成。HTML5的拖放API提供了原生支持,而vuedraggable则简化了列表拖拽…

vue实现图标拖拽

vue实现图标拖拽

Vue 实现图标拖拽 使用 HTML5 拖放 API 在 Vue 中实现图标拖拽可以利用 HTML5 的拖放 API。通过 draggable 属性标记可拖拽元素,并监听 dragstart、drag…

前端实现拖拽功能vue

前端实现拖拽功能vue

使用 HTML5 拖放 API 在 Vue 中可以通过 HTML5 的原生拖放 API 实现拖拽功能。需要监听 dragstart、dragover 和 drop 事件。 <template&…

vue实现拖拽计算器

vue实现拖拽计算器

Vue实现拖拽计算器的步骤 创建Vue项目 使用Vue CLI创建一个新项目,确保已安装Vue和必要的依赖项。通过命令行初始化项目并安装依赖。 vue create drag-calculator…

vue实现拖拽到容器里

vue实现拖拽到容器里

实现拖拽到容器的基本步骤 安装并引入 Vue.Draggable 库,这是一个基于 Sortable.js 的 Vue 拖拽组件。可以通过 npm 或 yarn 进行安装。 npm install…

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 drag…