vue实现按钮拖拽
Vue 实现按钮拖拽的方法
使用 HTML5 拖拽 API
在 Vue 中可以通过 HTML5 的拖拽 API 实现按钮拖拽功能。主要涉及 draggable 属性、dragstart、dragend、dragover 和 drop 事件。
<template>
<div
@dragover.prevent
@drop="handleDrop"
class="drop-area"
>
<button
draggable="true"
@dragstart="handleDragStart"
@dragend="handleDragEnd"
class="draggable-btn"
>
拖拽按钮
</button>
</div>
</template>
<script>
export default {
methods: {
handleDragStart(e) {
e.dataTransfer.setData('text/plain', e.target.id);
},
handleDragEnd() {
console.log('拖拽结束');
},
handleDrop(e) {
const id = e.dataTransfer.getData('text/plain');
const draggableElement = document.getElementById(id);
e.target.appendChild(draggableElement);
}
}
};
</script>
<style>
.drop-area {
width: 300px;
height: 300px;
border: 2px dashed #ccc;
display: flex;
justify-content: center;
align-items: center;
}
.draggable-btn {
padding: 10px 20px;
cursor: move;
}
</style>
使用第三方库(如 vuedraggable)
如果需要更复杂的拖拽功能,可以使用 vuedraggable 库。它是一个基于 Sortable.js 的 Vue 拖拽组件。
安装 vuedraggable:
npm install vuedraggable
使用示例:
<template>
<div>
<draggable v-model="items" @end="onDragEnd">
<div v-for="item in items" :key="item.id" class="draggable-item">
{{ item.name }}
</div>
</draggable>
</div>
</template>
<script>
import draggable from 'vuedraggable';
export default {
components: { draggable },
data() {
return {
items: [
{ id: 1, name: '按钮1' },
{ id: 2, name: '按钮2' },
{ id: 3, name: '按钮3' }
]
};
},
methods: {
onDragEnd() {
console.log('拖拽完成');
}
}
};
</script>
<style>
.draggable-item {
padding: 10px;
margin: 5px;
background: #f0f0f0;
cursor: move;
}
</style>
自定义拖拽逻辑
如果需要完全自定义拖拽行为,可以通过监听鼠标事件(mousedown、mousemove、mouseup)实现。
<template>
<div class="container">
<button
ref="draggableBtn"
@mousedown="startDrag"
class="custom-draggable-btn"
>
自定义拖拽按钮
</button>
</div>
</template>
<script>
export default {
data() {
return {
isDragging: false,
offsetX: 0,
offsetY: 0
};
},
methods: {
startDrag(e) {
this.isDragging = true;
this.offsetX = e.clientX - this.$refs.draggableBtn.getBoundingClientRect().left;
this.offsetY = e.clientY - this.$refs.draggableBtn.getBoundingClientRect().top;
document.addEventListener('mousemove', this.drag);
document.addEventListener('mouseup', this.stopDrag);
},
drag(e) {
if (!this.isDragging) return;
this.$refs.draggableBtn.style.left = `${e.clientX - this.offsetX}px`;
this.$refs.draggableBtn.style.top = `${e.clientY - this.offsetY}px`;
},
stopDrag() {
this.isDragging = false;
document.removeEventListener('mousemove', this.drag);
document.removeEventListener('mouseup', this.stopDrag);
}
},
mounted() {
this.$refs.draggableBtn.style.position = 'absolute';
}
};
</script>
<style>
.container {
position: relative;
width: 100%;
height: 300px;
border: 1px solid #eee;
}
.custom-draggable-btn {
padding: 10px 20px;
cursor: move;
}
</style>
注意事项
- 使用 HTML5 拖拽 API 时,注意
dragover事件需要调用preventDefault()以允许放置。 - 自定义拖拽逻辑时,确保在组件销毁时移除事件监听,避免内存泄漏。
vuedraggable适用于列表拖拽排序,而单个按钮拖拽可以使用更简单的方法实现。







