vue拖拽容器实现
实现 Vue 拖拽容器的步骤
使用 HTML5 原生拖拽 API
在 Vue 中可以通过 HTML5 的拖拽 API 实现基础的拖拽功能。需要监听 dragstart、dragover 和 drop 事件。
<template>
<div
class="draggable-container"
draggable="true"
@dragstart="handleDragStart"
@dragover.prevent
@drop="handleDrop"
>
<!-- 容器内容 -->
</div>
</template>
<script>
export default {
methods: {
handleDragStart(e) {
e.dataTransfer.setData('text/plain', e.target.id);
},
handleDrop(e) {
e.preventDefault();
const data = e.dataTransfer.getData('text/plain');
const draggedElement = document.getElementById(data);
e.target.appendChild(draggedElement);
}
}
};
</script>
使用第三方库 vue-draggable
vue-draggable 是基于 Sortable.js 的 Vue 拖拽组件,适合实现复杂的拖拽排序功能。
安装依赖:
npm install vuedraggable
基本用法:
<template>
<draggable v-model="items" group="tasks" @start="drag=true" @end="drag=false">
<div v-for="item in items" :key="item.id">
{{ item.name }}
</div>
</draggable>
</template>
<script>
import draggable from 'vuedraggable';
export default {
components: { draggable },
data() {
return {
items: [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' }
]
};
}
};
</script>
自定义拖拽指令
可以通过 Vue 的自定义指令实现更灵活的拖拽控制。
<template>
<div v-draggable class="draggable-box">
可拖拽元素
</div>
</template>
<script>
export default {
directives: {
draggable: {
inserted(el) {
el.draggable = true;
el.style.cursor = 'move';
el.addEventListener('dragstart', (e) => {
e.dataTransfer.setData('text/plain', el.id);
});
}
}
}
};
</script>
拖拽容器边界限制
如果需要限制拖拽范围,可以通过计算位置实现。
<template>
<div
ref="dragContainer"
class="drag-container"
@mousedown="startDrag"
@mousemove="onDrag"
@mouseup="stopDrag"
>
可拖拽容器
</div>
</template>
<script>
export default {
data() {
return {
isDragging: false,
startX: 0,
startY: 0
};
},
methods: {
startDrag(e) {
this.isDragging = true;
this.startX = e.clientX - this.$refs.dragContainer.getBoundingClientRect().left;
this.startY = e.clientY - this.$refs.dragContainer.getBoundingClientRect().top;
},
onDrag(e) {
if (!this.isDragging) return;
const container = this.$refs.dragContainer;
container.style.left = `${e.clientX - this.startX}px`;
container.style.top = `${e.clientY - this.startY}px`;
},
stopDrag() {
this.isDragging = false;
}
}
};
</script>
拖拽事件与动画结合
可以结合 CSS 过渡或动画提升用户体验。
.draggable-item {
transition: transform 0.2s ease;
}
.draggable-item.dragging {
opacity: 0.5;
transform: scale(1.05);
}
// 在拖拽开始和结束时切换 class
handleDragStart(e) {
e.target.classList.add('dragging');
},
handleDragEnd(e) {
e.target.classList.remove('dragging');
}
通过以上方法可以实现不同复杂度的拖拽容器功能,根据项目需求选择合适的方式。







