当前位置:首页 > VUE

vue实现卡片拖拽

2026-01-17 15:35:24VUE

Vue 实现卡片拖拽的方法

使用 HTML5 拖放 API

HTML5 提供了原生拖放 API,结合 Vue 可以轻松实现拖拽功能。以下是一个基本实现示例:

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

<script>
export default {
  data() {
    return {
      cardContent: '可拖拽卡片'
    }
  },
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', this.cardContent)
    },
    handleDrop(e) {
      e.preventDefault()
      const data = e.dataTransfer.getData('text/plain')
      this.cardContent = data
    }
  }
}
</script>

使用 Vue.Draggable 库

Vue.Draggable 是基于 Sortable.js 的 Vue 组件,提供了更丰富的拖拽功能。

安装依赖:

npm install vuedraggable

基本用法:

<template>
  <draggable 
    v-model="cards" 
    group="cards" 
    @start="drag=true" 
    @end="drag=false"
  >
    <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' }
      ]
    }
  }
}
</script>

自定义拖拽实现

对于更复杂的拖拽需求,可以结合鼠标事件实现自定义拖拽逻辑:

<template>
  <div class="card-container">
    <div 
      v-for="card in cards" 
      :key="card.id"
      class="card"
      :style="{ left: card.x + 'px', top: card.y + 'px' }"
      @mousedown="startDrag(card, $event)"
    >
      {{ card.content }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      cards: [
        { id: 1, content: '卡片1', x: 0, y: 0 },
        { id: 2, content: '卡片2', x: 100, y: 100 }
      ],
      dragging: null,
      offsetX: 0,
      offsetY: 0
    }
  },
  methods: {
    startDrag(card, e) {
      this.dragging = card
      this.offsetX = e.clientX - card.x
      this.offsetY = e.clientY - card.y
      document.addEventListener('mousemove', this.onDrag)
      document.addEventListener('mouseup', this.stopDrag)
    },
    onDrag(e) {
      if (this.dragging) {
        this.dragging.x = e.clientX - this.offsetX
        this.dragging.y = e.clientY - this.offsetY
      }
    },
    stopDrag() {
      this.dragging = null
      document.removeEventListener('mousemove', this.onDrag)
      document.removeEventListener('mouseup', this.stopDrag)
    }
  }
}
</script>

<style>
.card-container {
  position: relative;
  height: 500px;
}
.card {
  position: absolute;
  width: 200px;
  height: 100px;
  background: #fff;
  border: 1px solid #ddd;
  cursor: move;
}
</style>

拖拽排序实现

实现卡片在容器内的拖拽排序:

<template>
  <div class="card-list">
    <div 
      v-for="(card, index) in cards"
      :key="card.id"
      class="card"
      draggable="true"
      @dragstart="dragStart(index)"
      @dragover.prevent="dragOver(index)"
      @drop="drop(index)"
    >
      {{ card.content }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      cards: [
        { id: 1, content: '卡片1' },
        { id: 2, content: '卡片2' },
        { id: 3, content: '卡片3' }
      ],
      draggedIndex: null
    }
  },
  methods: {
    dragStart(index) {
      this.draggedIndex = index
    },
    dragOver(index) {
      if (this.draggedIndex !== index) {
        const draggedItem = this.cards[this.draggedIndex]
        this.cards.splice(this.draggedIndex, 1)
        this.cards.splice(index, 0, draggedItem)
        this.draggedIndex = index
      }
    },
    drop() {
      this.draggedIndex = null
    }
  }
}
</script>

以上方法提供了不同复杂度的实现方案,可以根据项目需求选择合适的方案。HTML5 拖放 API 适合简单场景,Vue.Draggable 适合列表排序,自定义实现则提供了最大的灵活性。

vue实现卡片拖拽

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

相关文章

vue实现按卡片轮播

vue实现按卡片轮播

实现卡片轮播的基本思路 在Vue中实现卡片轮播可以通过结合v-for指令和动态样式绑定完成。核心是维护一个当前显示卡片的索引,通过CSS过渡效果实现平滑切换。 基础实现步骤 模板部分 使用v-for…

vue实现卡片

vue实现卡片

Vue 实现卡片组件的方法 使用 Vue 实现卡片组件可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 HTML 和 CSS 在 Vue 单文件组件中,可以通过模板和样式直接实现卡片…

vue拖拽实现方式

vue拖拽实现方式

Vue拖拽实现方式 使用HTML5原生拖拽API HTML5提供了原生的拖拽API,可以通过draggable属性、dragstart、dragend、dragover和drop等事件实现基础拖拽功能…

vue实现按卡片轮播

vue实现按卡片轮播

实现卡片轮播的基本思路 在Vue中实现卡片轮播通常需要结合轮播组件库或自定义滑动动画效果。核心逻辑包括动态渲染卡片、处理滑动事件、计算当前展示的卡片位置。 使用第三方库(Swiper) 安装Swi…

vue实现拖拽计算器

vue实现拖拽计算器

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

vue 实现拖拽

vue 实现拖拽

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