当前位置:首页 > 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 组件,提供了更丰富的拖拽功能,适合列表排序等复杂场景。

安装依赖:

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 是一个轻量级的拖拽库,可以实现更灵活的拖拽效果。

安装依赖:

npm install interactjs

使用示例:

vue 实现卡片拖动

<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。

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

相关文章

vue实现按卡片轮播

vue实现按卡片轮播

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

vue实现拖动刻度

vue实现拖动刻度

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

vue实现组件拖动

vue实现组件拖动

Vue 实现组件拖动的几种方法 使用 HTML5 拖放 API HTML5 原生提供了拖放 API,可以通过 draggable 属性实现基础拖拽功能。在 Vue 中可以通过事件绑定实现交互逻辑。…

vue实现拖动栏

vue实现拖动栏

Vue 实现拖动栏 使用 HTML5 拖放 API HTML5 提供了原生的拖放 API,可以直接在 Vue 中使用。通过 draggable 属性标记可拖动元素,并监听 dragstart、drag…

vue怎么实现拖动

vue怎么实现拖动

Vue 实现拖动的常用方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件实现基础拖动功能。适用于简单场景。 <temp…

vue实现卡片平铺

vue实现卡片平铺

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