当前位置:首页 > VUE

vue实现拖拉div

2026-02-20 13:48:19VUE

实现拖拽功能的基本步骤

在Vue中实现拖拽功能,可以使用HTML5的Drag and Drop API或第三方库如vuedraggable。以下是两种方法的详细说明。

使用HTML5 Drag and Drop API

HTML5原生提供了拖放API,可以通过监听拖放事件实现拖拽功能。

<template>
  <div
    class="draggable"
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
  >
    拖拽我
  </div>
  <div
    class="dropzone"
    @dragover="handleDragOver"
    @drop="handleDrop"
  >
    放置区域
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id);
      e.target.classList.add('dragging');
    },
    handleDragEnd(e) {
      e.target.classList.remove('dragging');
    },
    handleDragOver(e) {
      e.preventDefault();
    },
    handleDrop(e) {
      e.preventDefault();
      const id = e.dataTransfer.getData('text/plain');
      const draggableElement = document.getElementById(id);
      e.target.appendChild(draggableElement);
    }
  }
};
</script>

<style>
.draggable {
  width: 100px;
  height: 100px;
  background: #ccc;
  cursor: move;
}
.dropzone {
  width: 200px;
  height: 200px;
  background: #eee;
  margin-top: 10px;
}
.dragging {
  opacity: 0.5;
}
</style>

使用vuedraggable库

vuedraggable是一个基于Sortable.js的Vue拖拽组件,使用起来更加简单。

安装vuedraggable:

npm install vuedraggable

使用示例:

<template>
  <draggable
    v-model="list"
    @start="dragStart"
    @end="dragEnd"
  >
    <div v-for="item in list" :key="item.id" class="item">
      {{ item.name }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      list: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' }
      ]
    };
  },
  methods: {
    dragStart() {
      console.log('拖拽开始');
    },
    dragEnd() {
      console.log('拖拽结束');
    }
  }
};
</script>

<style>
.item {
  padding: 10px;
  margin: 5px;
  background: #f0f0f0;
  cursor: move;
}
</style>

自定义拖拽实现

如果需要更复杂的拖拽逻辑,可以结合鼠标事件(mousedown、mousemove、mouseup)手动实现拖拽。

vue实现拖拉div

<template>
  <div
    ref="draggable"
    class="draggable"
    @mousedown="startDrag"
  >
    拖拽我
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDragging: false,
      startX: 0,
      startY: 0,
      offsetX: 0,
      offsetY: 0
    };
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startX = e.clientX;
      this.startY = e.clientY;
      const rect = this.$refs.draggable.getBoundingClientRect();
      this.offsetX = this.startX - rect.left;
      this.offsetY = this.startY - rect.top;
      document.addEventListener('mousemove', this.drag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    drag(e) {
      if (!this.isDragging) return;
      const x = e.clientX - this.offsetX;
      const y = e.clientY - this.offsetY;
      this.$refs.draggable.style.left = `${x}px`;
      this.$refs.draggable.style.top = `${y}px`;
    },
    stopDrag() {
      this.isDragging = false;
      document.removeEventListener('mousemove', this.drag);
      document.removeEventListener('mouseup', this.stopDrag);
    }
  },
  mounted() {
    this.$refs.draggable.style.position = 'absolute';
  }
};
</script>

<style>
.draggable {
  width: 100px;
  height: 100px;
  background: #ccc;
  cursor: move;
}
</style>

注意事项

  • 使用HTML5 API时,注意阻止默认行为(如e.preventDefault())。
  • 使用vuedraggable时,确保数据是响应式的,以便拖拽后列表能正确更新。
  • 自定义拖拽实现时,注意移除事件监听器,避免内存泄漏。

标签: 拖拉vue
分享给朋友:

相关文章

vue实现拖放

vue实现拖放

Vue 实现拖放功能 Vue 中实现拖放功能通常可以通过 HTML5 的原生拖放 API 或第三方库(如 vuedraggable)来实现。以下是两种方法的详细说明。 使用 HTML5 原生拖放 A…

实现简易vue

实现简易vue

实现简易 Vue 的核心思路 Vue 的核心功能包括数据响应式、模板编译和虚拟 DOM。以下是一个简易实现方案,涵盖核心功能模块。 数据响应式系统 通过 Object.defineProperty…

vue 实现搜索

vue 实现搜索

实现 Vue 搜索功能 在 Vue 中实现搜索功能通常涉及以下几个关键步骤: 数据绑定与输入监听 使用 v-model 双向绑定搜索输入框的值,监听用户输入: <template>…

vue实现mui

vue实现mui

使用 Vue 实现 MUI(Material-UI)风格的界面 Vue 本身不直接提供 MUI(Material Design)组件,但可以通过集成第三方库或手动实现来达到类似效果。以下是几种常见方法…

vue实现画廊

vue实现画廊

Vue实现画廊的基本方法 使用Vue.js实现画廊功能可以通过多种方式完成,以下是一种常见的实现方案: 安装必要依赖 npm install vue-gallery --save 引入组件并注册…

mvvm实现vue

mvvm实现vue

MVVM 模式在 Vue 中的实现 MVVM(Model-View-ViewModel)是一种前端架构模式,Vue 的设计灵感来源于此。以下是 MVVM 在 Vue 中的核心实现方式: 数据绑定(M…