当前位置:首页 > VUE

vue 实现卡片拖动

2026-01-08 05:07:55VUE

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

使用 Vue 实现卡片拖动可以通过多种方式实现,以下是几种常见的方法:

vue 实现卡片拖动

使用 HTML5 原生拖放 API

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

vue 实现卡片拖动

<template>
  <div
    v-for="(card, index) in cards"
    :key="index"
    class="card"
    draggable="true"
    @dragstart="handleDragStart($event, index)"
    @dragover.prevent
    @drop="handleDrop($event, index)"
  >
    {{ card.text }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      cards: [
        { text: 'Card 1' },
        { text: 'Card 2' },
        { text: 'Card 3' }
      ],
      draggedIndex: null
    };
  },
  methods: {
    handleDragStart(event, index) {
      this.draggedIndex = index;
      event.dataTransfer.setData('text/plain', index);
    },
    handleDrop(event, index) {
      const fromIndex = this.draggedIndex;
      const toIndex = index;
      if (fromIndex !== toIndex) {
        const card = this.cards[fromIndex];
        this.cards.splice(fromIndex, 1);
        this.cards.splice(toIndex, 0, card);
      }
    }
  }
};
</script>

<style>
.card {
  padding: 10px;
  margin: 5px;
  border: 1px solid #ccc;
  background: #f9f9f9;
  cursor: move;
}
</style>

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,提供了更简单的拖放实现。

<template>
  <draggable v-model="cards" group="cards" @start="drag=true" @end="drag=false">
    <div v-for="(card, index) in cards" :key="index" class="card">
      {{ card.text }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: {
    draggable
  },
  data() {
    return {
      cards: [
        { text: 'Card 1' },
        { text: 'Card 2' },
        { text: 'Card 3' }
      ]
    };
  }
};
</script>

<style>
.card {
  padding: 10px;
  margin: 5px;
  border: 1px solid #ccc;
  background: #f9f9f9;
  cursor: move;
}
</style>

使用鼠标事件实现自定义拖动

通过监听鼠标事件,可以实现更灵活的拖动效果。

<template>
  <div
    v-for="(card, index) in cards"
    :key="index"
    class="card"
    @mousedown="startDrag($event, index)"
    @mousemove="dragCard($event, index)"
    @mouseup="stopDrag"
    :style="{
      position: 'relative',
      left: card.dragging ? card.dragX + 'px' : '0',
      top: card.dragging ? card.dragY + 'px' : '0'
    }"
  >
    {{ card.text }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      cards: [
        { text: 'Card 1', dragging: false, dragX: 0, dragY: 0 },
        { text: 'Card 2', dragging: false, dragX: 0, dragY: 0 },
        { text: 'Card 3', dragging: false, dragX: 0, dragY: 0 }
      ],
      dragStartX: 0,
      dragStartY: 0
    };
  },
  methods: {
    startDrag(event, index) {
      this.cards[index].dragging = true;
      this.dragStartX = event.clientX - this.cards[index].dragX;
      this.dragStartY = event.clientY - this.cards[index].dragY;
    },
    dragCard(event, index) {
      if (this.cards[index].dragging) {
        this.cards[index].dragX = event.clientX - this.dragStartX;
        this.cards[index].dragY = event.clientY - this.dragStartY;
      }
    },
    stopDrag() {
      this.cards.forEach(card => {
        card.dragging = false;
      });
    }
  }
};
</script>

<style>
.card {
  padding: 10px;
  margin: 5px;
  border: 1px solid #ccc;
  background: #f9f9f9;
  cursor: move;
}
</style>

注意事项

  • 使用 HTML5 原生拖放 API 时,注意 dragover 事件需要调用 preventDefault 以允许放置。
  • Vue.Draggable 提供了丰富的配置选项,如动画、限制拖动方向等,可以参考其文档。
  • 自定义拖动实现时,注意处理鼠标事件的位置计算,确保拖动效果流畅。

以上方法可以根据具体需求选择适合的实现方式。

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

相关文章

vue实现卡片切换

vue实现卡片切换

Vue实现卡片切换的方法 使用v-if和v-show指令 通过Vue的指令控制卡片的显示与隐藏,适合简单的卡片切换需求。 <template> <div> <…

vue实现位移拖动

vue实现位移拖动

Vue 实现位移拖动的方法 使用鼠标事件实现拖动 在 Vue 中可以通过监听鼠标事件实现元素的位移拖动。需要监听 mousedown、mousemove 和 mouseup 事件来跟踪拖动过程。 &…

vue实现卡片效果

vue实现卡片效果

Vue实现卡片效果的方法 使用Vue实现卡片效果可以通过多种方式完成,包括使用原生CSS、UI框架或自定义组件。以下是几种常见方法: 使用原生CSS和Vue组件 创建一个简单的卡片组件,结合CSS实…

vue实现卡片移动

vue实现卡片移动

Vue实现卡片移动的方法 使用拖拽库实现卡片移动 Vue中可以通过引入第三方拖拽库如vuedraggable实现卡片拖拽排序功能。安装后直接在组件中引入,将卡片数据绑定到vraggable组件即可实现…

vue实现双列商品卡片

vue实现双列商品卡片

Vue 实现双列商品卡片 使用 Vue 实现双列商品卡片可以通过 flex 布局或 grid 布局实现,以下是两种常见方法: 方法一:使用 Flex 布局 <template>…

vue实现鼠标拖动多选

vue实现鼠标拖动多选

Vue 实现鼠标拖动多选框 基本思路 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖动选区,结合动态计算选中元素的范围完成多选功能。核心是记录起始位置和当前鼠标位置,…