当前位置:首页 > 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-draggable:

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"
    @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>

拖拽边界限制

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

vue实现卡片拖拽

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 实现弹出卡片的方法 使用 v-if 或 v-show 控制显示 通过 Vue 的指令 v-if 或 v-show 可以控制弹出卡片的显示和隐藏。v-if 会动态添加或移除 DOM 元素,而 v…

jquery 拖拽

jquery 拖拽

jQuery 拖拽实现方法 使用 jQuery 实现拖拽功能可以通过多种方式完成,以下是常见的几种方法: 使用 jQuery UI 的拖拽功能 jQuery UI 提供了 draggable 方法,…

vue实现拖拽图层

vue实现拖拽图层

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

vue拖拽功能实现

vue拖拽功能实现

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

vue实现可拖拽

vue实现可拖拽

实现拖拽功能的基本方法 在Vue中实现拖拽功能通常可以通过HTML5的Drag and Drop API或第三方库如vuedraggable来完成。以下是两种主要实现方式: 使用HTML5原生API…

vue ztree实现拖拽

vue ztree实现拖拽

实现 Vue 中 ZTree 的拖拽功能 在 Vue 项目中实现 ZTree 的拖拽功能,通常需要结合 jQuery 的 ZTree 插件。以下是具体实现方法: 安装依赖 确保项目中已引入 jQue…