vue实现拖拽div
Vue 实现拖拽 Div 的方法
使用原生 HTML5 拖拽 API
HTML5 提供了原生的拖拽 API,结合 Vue 的事件绑定可以快速实现拖拽功能。以下是实现步骤:
<template>
<div
class="draggable"
draggable="true"
@dragstart="handleDragStart"
@dragend="handleDragEnd"
>
拖拽我
</div>
</template>
<script>
export default {
methods: {
handleDragStart(e) {
e.dataTransfer.setData('text/plain', e.target.id);
e.target.style.opacity = '0.4';
},
handleDragEnd(e) {
e.target.style.opacity = '1';
}
}
}
</script>
使用 Vue 指令实现自由拖拽
通过自定义指令实现更灵活的拖拽效果,适用于任意元素:

<template>
<div v-draggable class="box"></div>
</template>
<script>
export default {
directives: {
draggable: {
inserted(el) {
el.onmousedown = (e) => {
const disX = e.clientX - el.offsetLeft;
const disY = e.clientY - el.offsetTop;
document.onmousemove = (e) => {
el.style.left = e.clientX - disX + 'px';
el.style.top = e.clientY - disY + 'px';
};
document.onmouseup = () => {
document.onmousemove = null;
document.onmouseup = null;
};
};
}
}
}
}
</script>
<style>
.box {
position: absolute;
width: 100px;
height: 100px;
background: #42b983;
cursor: move;
}
</style>
使用第三方库
对于更复杂的拖拽需求,可以使用专门的 Vue 拖拽库:
-
Vue.Draggable
适用于列表排序场景:
npm install vuedraggable<template> <draggable v-model="list"> <div v-for="item in list" :key="item.id">{{ item.name }}</div> </draggable> </template> <script> import draggable from 'vuedraggable'; export default { components: { draggable }, data() { return { list: [{id:1, name:'Item 1'}] } } } </script> -
Interact.js
提供更精细的拖拽控制:<template> <div ref="dragEl" class="drag-target"></div> </template> <script> import interact from 'interactjs'; export default { mounted() { interact(this.$refs.dragEl) .draggable({ inertia: true }) .on('dragmove', (event) => { const target = event.target; target.style.transform = `translate(${event.dx}px, ${event.dy}px)`; }); } } </script>
移动端适配
针对触摸设备需要添加 touch 事件支持:
el.addEventListener('touchstart', handleStart);
el.addEventListener('touchmove', handleMove);
el.addEventListener('touchend', handleEnd);
性能优化建议
- 对于频繁更新的元素,使用 CSS
transform代替top/left属性 - 在拖拽结束时移除事件监听器
- 复杂场景考虑使用 requestAnimationFrame
以上方法可根据具体需求选择,简单交互推荐原生实现,复杂场景建议使用成熟库。






