当前位置:首页 > 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 事件。

vue实现卡片移动

示例代码:

<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 过渡或动画增强用户体验。例如,为卡片添加平滑的移动效果。

vue实现卡片移动

示例 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 实现滑动输入条 使用原生 HTML5 input range 实现 在 Vue 模板中直接使用 <input type="range">,通过 v-model 绑定数据:…

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <templat…

vue 实现关闭

vue 实现关闭

Vue 实现关闭功能的方法 在Vue中实现关闭功能通常涉及组件销毁、模态框隐藏或路由跳转等场景。以下是几种常见实现方式: 销毁当前组件 使用v-if或v-show控制组件显示/隐藏,适用于局部组件:…

vue实现modal

vue实现modal

Vue 实现 Modal 弹窗组件 使用 Vue 实现 Modal 弹窗组件可以通过多种方式,包括原生 Vue 组件、第三方库或自定义指令。以下是几种常见方法: 原生 Vue 组件实现 创建一个基础…

vue实现图片

vue实现图片

Vue 实现图片功能的方法 静态图片引入 在 Vue 项目中,可以通过 src 属性直接引入静态图片。图片通常放在 public 或 assets 目录下。 <template> &…

vue实现slidetoggle

vue实现slidetoggle

Vue 实现 SlideToggle 效果 SlideToggle 是一种常见的交互效果,元素以滑动方式展开或收起。以下是几种实现方法: 使用 CSS Transition 和 v-show 通过…