当前位置:首页 > VUE

vue实现卡片拖拽

2026-03-30 08:54:26VUE

Vue 实现卡片拖拽功能

使用 HTML5 原生拖拽 API

在 Vue 中可以通过 HTML5 的拖拽 API 实现卡片拖拽功能。需要设置 draggable 属性为 true,并监听 dragstartdragoverdrop 事件。

<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 拖拽组件库,适合实现列表或卡片的拖拽排序。

vue实现卡片拖拽

安装 vue-draggable:

npm install vuedraggable

使用示例:

vue实现卡片拖拽

<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"
    @mousedown="startDrag"
    :style="{ left: position.x + 'px', top: position.y + 'px' }"
  >
    {{ cardContent }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      cardContent: '自定义拖拽卡片',
      position: { x: 0, y: 0 },
      isDragging: false,
      startPos: { x: 0, y: 0 }
    }
  },
  mounted() {
    window.addEventListener('mousemove', this.handleDrag)
    window.addEventListener('mouseup', this.stopDrag)
  },
  beforeDestroy() {
    window.removeEventListener('mousemove', this.handleDrag)
    window.removeEventListener('mouseup', this.stopDrag)
  },
  methods: {
    startDrag(e) {
      this.isDragging = true
      this.startPos = { x: e.clientX - this.position.x, y: e.clientY - this.position.y }
    },
    handleDrag(e) {
      if (this.isDragging) {
        this.position.x = e.clientX - this.startPos.x
        this.position.y = e.clientY - this.startPos.y
      }
    },
    stopDrag() {
      this.isDragging = false
    }
  }
}
</script>

<style>
.card {
  position: absolute;
  width: 200px;
  height: 100px;
  background: #f0f0f0;
  cursor: move;
}
</style>

拖拽边界限制

在实际应用中,通常需要限制拖拽范围,防止卡片被拖出可视区域。

handleDrag(e) {
  if (this.isDragging) {
    let newX = e.clientX - this.startPos.x
    let newY = e.clientY - this.startPos.y

    // 限制在窗口范围内
    const maxX = window.innerWidth - this.$el.offsetWidth
    const maxY = window.innerHeight - this.$el.offsetHeight

    this.position.x = Math.max(0, Math.min(newX, maxX))
    this.position.y = Math.max(0, Math.min(newY, maxY))
  }
}

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

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

相关文章

vue实现模块拖拽

vue实现模块拖拽

Vue 实现模块拖拽的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dro…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

vue内实现拖拽

vue内实现拖拽

Vue 实现拖拽功能的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。 <template>…

vue 实现拖拽甘特图

vue 实现拖拽甘特图

实现拖拽甘特图的核心思路 Vue 实现拖拽甘特图需要结合第三方库或自定义逻辑,核心功能包括任务条渲染、时间轴刻度、拖拽交互、数据绑定等。以下是具体实现方法: 使用第三方库(推荐) vue-gantt…

vue实现拖拽替换

vue实现拖拽替换

实现拖拽替换的基本思路 使用HTML5的拖放API结合Vue的响应式数据绑定,可以轻松实现元素的拖拽替换功能。核心是利用draggable属性、dragstart、dragover和drop事件。…

vue实现卡片切换

vue实现卡片切换

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