当前位置:首页 > VUE

vue实现卡片移动

2026-02-20 07:52:21VUE

Vue 实现卡片移动的方法

使用拖拽库实现卡片移动

Vue 提供了多种拖拽库,如 vuedraggable,可以轻松实现卡片的拖拽移动。安装 vuedraggable 后,通过简单的配置即可实现卡片拖拽排序。

安装 vuedraggable

npm install vuedraggable

示例代码:

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

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      cards: [
        { id: 1, text: 'Card 1' },
        { id: 2, text: 'Card 2' },
        { id: 3, text: 'Card 3' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('卡片顺序已更新');
    }
  }
};
</script>

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

使用原生 HTML5 拖拽 API

如果不依赖第三方库,可以通过 HTML5 的拖拽 API 实现卡片移动。需要监听 dragstartdragoverdrop 事件。

示例代码:

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

<script>
export default {
  data() {
    return {
      cards: [
        { id: 1, text: 'Card 1' },
        { id: 2, text: 'Card 2' },
        { id: 3, text: 'Card 3' }
      ],
      draggedCardId: null
    };
  },
  methods: {
    dragStart(event, cardId) {
      event.dataTransfer.setData('text/plain', cardId);
      this.draggedCardId = cardId;
    },
    drop(event, targetCardId) {
      const draggedCardIndex = this.cards.findIndex(card => card.id === this.draggedCardId);
      const targetCardIndex = this.cards.findIndex(card => card.id === targetCardId);

      if (draggedCardIndex !== -1 && targetCardIndex !== -1) {
        const [draggedCard] = this.cards.splice(draggedCardIndex, 1);
        this.cards.splice(targetCardIndex, 0, draggedCard);
      }
    }
  }
};
</script>

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

使用 CSS 动画增强移动效果

在卡片移动时,可以通过 CSS 过渡或动画增强用户体验。例如,为卡片添加平滑的移动效果。

示例 CSS:

.card {
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.card:active {
  transform: scale(1.05);
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}

结合 Vue Transition 实现动画

Vue 的 <transition> 组件可以为卡片移动添加更复杂的动画效果。例如,在卡片位置变化时添加淡入淡出效果。

示例代码:

<template>
  <div class="card-container">
    <transition-group name="card-move" tag="div">
      <div 
        v-for="card in cards" 
        :key="card.id" 
        class="card" 
        draggable="true"
        @dragstart="dragStart($event, card.id)"
        @dragover.prevent
        @drop="drop($event, card.id)"
      >
        {{ card.text }}
      </div>
    </transition-group>
  </div>
</template>

<style>
.card-move {
  transition: all 0.5s ease;
}
</style>

注意事项

  • 使用 vuedraggable 时,确保 v-model 绑定的是数组,且每个元素有唯一的 key
  • 原生拖拽 API 需要处理 dragover 事件的默认行为(event.preventDefault())。
  • 动画效果应避免过度复杂,以免影响性能。

vue实现卡片移动

标签: 卡片vue
分享给朋友:

相关文章

vue按钮实现截屏

vue按钮实现截屏

Vue 按钮实现截屏的方法 在 Vue 项目中实现截屏功能可以通过多种方式完成,以下是几种常见的方法: 使用 html2canvas 库 安装 html2canvas 库: npm ins…

vue权限实现

vue权限实现

Vue 权限实现方案 基于路由的权限控制 通过路由守卫实现权限验证,在路由配置中添加meta字段标记权限要求。在router.beforeEach中检查用户权限与路由要求的匹配情况。 // rout…

vue怎么实现

vue怎么实现

Vue 实现方法 Vue 是一个流行的前端框架,用于构建用户界面。以下是几种常见的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。 <input v-m…

vue实现排序

vue实现排序

Vue 实现排序的方法 在 Vue 中实现排序可以通过多种方式完成,以下是一些常见的方法: 使用计算属性排序数组 计算属性非常适合对数据进行排序,因为它会在依赖的数据变化时自动更新。以下是一个示例…

vue 实现排序

vue 实现排序

Vue 实现排序的方法 使用计算属性实现排序 通过计算属性对数组进行排序,可以保持原始数据不变。示例代码展示了如何对列表按名称升序排序: <template> <div>…

vue实现动画

vue实现动画

Vue 实现动画的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及直接操作 CSS 或 JavaScript 动画。 使用 Vue 内置过渡系统 Vue 的 <…