当前位置:首页 > VUE

vue 实现卡片拖动

2026-03-28 05:20:13VUE

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()
      this.cardContent = e.dataTransfer.getData('text/plain')
    }
  }
}
</script>

使用 Vue.Draggable 库

Vue.Draggable 是基于 Sortable.js 的 Vue 组件,提供了更丰富的拖拽功能,适合列表排序等复杂场景。

安装依赖:

vue 实现卡片拖动

npm install vuedraggable

使用示例:

<template>
  <draggable 
    v-model="cards" 
    group="cards" 
    @end="onDragEnd"
  >
    <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' }
      ]
    }
  },
  methods: {
    onDragEnd() {
      console.log('拖拽结束', this.cards)
    }
  }
}
</script>

使用 interact.js 实现自定义拖拽

interact.js 是一个轻量级的拖拽库,可以实现更灵活的拖拽效果。

vue 实现卡片拖动

安装依赖:

npm install interactjs

使用示例:

<template>
  <div 
    ref="card" 
    class="card"
  >
    {{ cardContent }}
  </div>
</template>

<script>
import interact from 'interactjs'

export default {
  data() {
    return {
      cardContent: '可拖动卡片'
    }
  },
  mounted() {
    interact(this.$refs.card)
      .draggable({
        inertia: true,
        modifiers: [
          interact.modifiers.restrictRect({
            restriction: 'parent',
            endOnly: true
          })
        ],
        onmove: this.dragMoveListener
      })
  },
  methods: {
    dragMoveListener(event) {
      const target = event.target
      const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx
      const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy

      target.style.transform = `translate(${x}px, ${y}px)`
      target.setAttribute('data-x', x)
      target.setAttribute('data-y', y)
    }
  }
}
</script>

使用拖拽的注意事项

  1. 性能优化:对于大量可拖拽元素,应考虑使用虚拟滚动等技术优化性能
  2. 移动端适配:部分库可能需要额外处理移动端触摸事件
  3. 状态管理:复杂场景下建议结合 Vuex 管理拖拽状态
  4. 无障碍访问:确保拖拽操作对屏幕阅读器等辅助设备友好

选择哪种方法取决于具体需求:简单场景可用 HTML5 API,列表排序推荐 Vue.Draggable,需要高度自定义则考虑 interact.js。

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

相关文章

jquery 拖动

jquery 拖动

jQuery 拖动实现方法 jQuery本身不直接提供拖动功能,但可以通过结合jQuery UI或原生HTML5的拖放API实现。以下是两种常见方法: 使用jQuery UI实现拖动 jQuery…

vue实现拖动刻度

vue实现拖动刻度

实现拖动刻度功能 在Vue中实现拖动刻度功能可以通过结合原生HTML5的拖拽API和Vue的数据绑定特性来完成。以下是一个完整的实现方案: 基本实现思路 创建一个可拖动的滑块元素 监听鼠标事件处理拖…

vue实现卡片翻转

vue实现卡片翻转

Vue 实现卡片翻转效果 卡片翻转效果可以通过 CSS 3D 变换和 Vue 的过渡系统实现。以下是两种常见实现方式: 基础 CSS 3D 翻转 <template> <div…

vue实现拖动功能

vue实现拖动功能

使用HTML5拖放API实现基础拖动 Vue中可以通过HTML5原生拖放API实现基础拖动功能。在元素上添加draggable="true"属性使其可拖动,通过@dragstart事件设置被拖拽数据。…

vue实现卡片平铺

vue实现卡片平铺

Vue 实现卡片平铺布局 使用 Vue 实现卡片平铺布局通常结合 CSS Grid 或 Flexbox 实现响应式排列,以下是两种常见方法: 使用 CSS Grid 布局 通过 display: g…

vue实现拖动图片思路

vue实现拖动图片思路

Vue 实现拖动图片的思路 在 Vue 中实现图片拖动功能,可以通过以下方法实现: 使用 HTML5 拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件…