vue实现卡片拖拽
Vue 实现卡片拖拽功能
使用 HTML5 拖放 API
HTML5 原生提供了拖放 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop 事件实现拖拽功能。
<template>
<div>
<div
v-for="(item, index) in items"
:key="index"
draggable="true"
@dragstart="handleDragStart(index)"
@dragover.prevent
@drop="handleDrop(index)"
class="draggable-item"
>
{{ item }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
items: ['Item 1', 'Item 2', 'Item 3'],
draggedIndex: null
}
},
methods: {
handleDragStart(index) {
this.draggedIndex = index
},
handleDrop(index) {
const draggedItem = this.items[this.draggedIndex]
this.items.splice(this.draggedIndex, 1)
this.items.splice(index, 0, draggedItem)
}
}
}
</script>
<style>
.draggable-item {
padding: 10px;
margin: 5px;
background: #f0f0f0;
cursor: move;
}
</style>
使用第三方库 Vue.Draggable
Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,提供了更丰富的拖拽功能,适合复杂场景。
安装 Vue.Draggable:
npm install vuedraggable
使用示例:
<template>
<draggable
v-model="items"
@end="onDragEnd"
class="drag-area"
>
<div v-for="(item, index) in items" :key="index" class="draggable-item">
{{ item }}
</div>
</draggable>
</template>
<script>
import draggable from 'vuedraggable'
export default {
components: { draggable },
data() {
return {
items: ['Item 1', 'Item 2', 'Item 3']
}
},
methods: {
onDragEnd() {
console.log('拖拽完成', this.items)
}
}
}
</script>
<style>
.drag-area {
min-height: 50px;
}
.draggable-item {
padding: 10px;
margin: 5px;
background: #f0f0f0;
}
</style>
拖拽动画优化
为拖拽添加过渡动画可以提升用户体验,Vue 的 <transition-group> 可以与拖拽功能结合使用。
<template>
<draggable v-model="items" tag="transition-group" class="drag-area">
<div v-for="(item, index) in items" :key="index" class="draggable-item">
{{ item }}
</div>
</draggable>
</template>
<style>
.drag-area {
min-height: 50px;
}
.draggable-item {
padding: 10px;
margin: 5px;
background: #f0f0f0;
transition: all 0.3s;
}
</style>
跨列表拖拽
Vue.Draggable 支持多个列表之间的拖拽,通过 group 属性实现。
<template>
<div class="container">
<draggable
v-model="list1"
group="items"
class="drag-area"
>
<div v-for="(item, index) in list1" :key="`list1-${index}`" class="draggable-item">
{{ item }}
</div>
</draggable>
<draggable
v-model="list2"
group="items"
class="drag-area"
>
<div v-for="(item, index) in list2" :key="`list2-${index}`" class="draggable-item">
{{ item }}
</div>
</draggable>
</div>
</template>
<script>
import draggable from 'vuedraggable'
export default {
components: { draggable },
data() {
return {
list1: ['Item A', 'Item B', 'Item C'],
list2: ['Item X', 'Item Y', 'Item Z']
}
}
}
</script>
<style>
.container {
display: flex;
gap: 20px;
}
.drag-area {
min-height: 50px;
width: 200px;
border: 1px dashed #ccc;
padding: 10px;
}
.draggable-item {
padding: 10px;
margin: 5px;
background: #f0f0f0;
}
</style>
拖拽限制
可以通过 Vue.Draggable 的 disabled 属性或自定义逻辑限制某些元素的拖拽。

<template>
<draggable
v-model="items"
:disabled="isDisabled"
class="drag-area"
>
<div v-for="(item, index) in items" :key="index" class="draggable-item">
{{ item }}
<button @click="toggleDisabled">Toggle Disable</button>
</div>
</draggable>
</template>
<script>
import draggable from 'vuedraggable'
export default {
components: { draggable },
data() {
return {
items: ['Item 1', 'Item 2', 'Item 3'],
isDisabled: false
}
},
methods: {
toggleDisabled() {
this.isDisabled = !this.isDisabled
}
}
}
</script>
以上方法涵盖了从基础到高级的 Vue 卡片拖拽实现,可根据具体需求选择合适的方案。






