vue实现内容拖动
Vue 实现内容拖动的方法
使用原生 HTML5 拖放 API
在 Vue 中可以利用 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)"
>
{{ 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>
使用第三方库 Vue.Draggable
Vue.Draggable 是基于 Sortable.js 的 Vue 组件,提供了更强大的拖拽功能,支持列表排序、跨列表拖拽等。

安装 Vue.Draggable:

npm install vuedraggable
使用示例:
<template>
<div>
<draggable
v-model="items"
@end="onDragEnd"
>
<div v-for="(item, index) in items" :key="index">
{{ item }}
</div>
</draggable>
</div>
</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>
自定义拖动逻辑
如果需要更复杂的拖动逻辑,可以结合鼠标事件(mousedown、mousemove、mouseup)来实现自定义拖动效果。
<template>
<div>
<div
v-for="(item, index) in items"
:key="index"
class="draggable-item"
@mousedown="startDrag(index, $event)"
>
{{ item }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
items: ['Item 1', 'Item 2', 'Item 3'],
isDragging: false,
draggedIndex: null,
startY: 0
}
},
methods: {
startDrag(index, event) {
this.isDragging = true
this.draggedIndex = index
this.startY = event.clientY
document.addEventListener('mousemove', this.handleDrag)
document.addEventListener('mouseup', this.stopDrag)
},
handleDrag(event) {
if (!this.isDragging) return
const currentY = event.clientY
const deltaY = currentY - this.startY
// 根据 deltaY 更新元素位置
},
stopDrag() {
this.isDragging = false
document.removeEventListener('mousemove', this.handleDrag)
document.removeEventListener('mouseup', this.stopDrag)
}
}
}
</script>
注意事项
- 使用 HTML5 拖放 API 时,需要阻止
dragover事件的默认行为(event.preventDefault()),否则拖放可能无法正常工作。 - Vue.Draggable 提供了丰富的配置选项,如
group(分组)、handle(拖动句柄)、animation(动画效果)等,可以根据需求调整。 - 自定义拖动逻辑时,注意性能优化,避免频繁的 DOM 操作。





