vue实现图片拖拽
Vue 实现图片拖拽功能
实现图片拖拽功能需要结合 Vue 的事件监听和 DOM 操作。以下是两种常见的方法:
使用原生 HTML5 拖拽 API
HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。
<template>
<div>
<img
src="your-image-path.jpg"
draggable="true"
@dragstart="handleDragStart"
/>
<div
@dragover.prevent
@drop="handleDrop"
style="width: 300px; height: 300px; border: 1px dashed #ccc;"
>
拖拽到这里
</div>
</div>
</template>
<script>
export default {
methods: {
handleDragStart(e) {
e.dataTransfer.setData('text/plain', e.target.src);
},
handleDrop(e) {
e.preventDefault();
const imgSrc = e.dataTransfer.getData('text/plain');
const img = document.createElement('img');
img.src = imgSrc;
e.target.appendChild(img);
}
}
};
</script>
使用第三方库(如 vue-draggable)
对于更复杂的拖拽需求,可以使用第三方库如 vue-draggable,它基于 Sortable.js 实现。
安装库:
npm install vuedraggable
使用示例:
<template>
<div>
<draggable
v-model="images"
@start="drag=true"
@end="drag=false"
>
<div v-for="(image, index) in images" :key="index">
<img :src="image.src" style="width: 100px; height: 100px;"/>
</div>
</draggable>
</div>
</template>
<script>
import draggable from 'vuedraggable';
export default {
components: { draggable },
data() {
return {
images: [
{ src: 'image1.jpg' },
{ src: 'image2.jpg' },
{ src: 'image3.jpg' }
]
};
}
};
</script>
自定义拖拽实现
如果需要完全自定义拖拽行为,可以通过监听鼠标事件实现。

<template>
<div>
<img
src="your-image-path.jpg"
@mousedown="startDrag"
style="position: absolute; cursor: move;"
:style="{ left: pos.x + 'px', top: pos.y + 'px' }"
/>
</div>
</template>
<script>
export default {
data() {
return {
pos: { x: 0, y: 0 },
isDragging: false,
startPos: { x: 0, y: 0 }
};
},
methods: {
startDrag(e) {
this.isDragging = true;
this.startPos = {
x: e.clientX - this.pos.x,
y: e.clientY - this.pos.y
};
document.addEventListener('mousemove', this.drag);
document.addEventListener('mouseup', this.stopDrag);
},
drag(e) {
if (!this.isDragging) return;
this.pos = {
x: e.clientX - this.startPos.x,
y: e.clientY - this.startPos.y
};
},
stopDrag() {
this.isDragging = false;
document.removeEventListener('mousemove', this.drag);
document.removeEventListener('mouseup', this.stopDrag);
}
}
};
</script>
以上方法可以根据具体需求选择使用。原生 API 适合简单场景,第三方库适合复杂交互,自定义实现则提供最大灵活性。






