当前位置:首页 > VUE

vue实现div拖拽

2026-03-29 04:58:17VUE

实现 div 拖拽的基本方法

在 Vue 中实现 div 拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库(如 vuedraggable)完成。以下是两种常见方法的实现细节:

使用 HTML5 拖拽 API

通过原生拖拽事件(dragstartdragenddragoverdrop)实现:

<template>
  <div
    class="draggable-div"
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
    @dragover.prevent="handleDragOver"
    @drop="handleDrop"
  >
    拖拽我
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData("text/plain", e.target.id);
      e.target.style.opacity = "0.5";
    },
    handleDragEnd(e) {
      e.target.style.opacity = "1";
    },
    handleDragOver(e) {
      e.preventDefault(); // 必须阻止默认行为以允许放置
    },
    handleDrop(e) {
      e.preventDefault();
      const data = e.dataTransfer.getData("text/plain");
      const draggedElement = document.getElementById(data);
      e.target.appendChild(draggedElement);
    },
  },
};
</script>

<style>
.draggable-div {
  width: 100px;
  height: 100px;
  background-color: #42b983;
  cursor: move;
}
</style>

关键点:

  • 设置 draggable="true" 启用拖拽。
  • 通过 dataTransfer 传递数据。
  • 必须调用 preventDefault() 允许放置操作。

使用 vuedraggable

对于复杂场景(如列表排序),推荐使用 vuedraggable(基于 Sortable.js):

vue实现div拖拽

  1. 安装依赖:

    npm install vuedraggable
  2. 实现代码:

    vue实现div拖拽

    
    <template>
    <draggable v-model="list" @end="onDragEnd">
     <div v-for="item in list" :key="item.id" class="item">
       {{ item.name }}
     </div>
    </draggable>
    </template>
import draggable from "vuedraggable"; export default { components: { draggable }, data() { return { list: [ { id: 1, name: "Item 1" }, { id: 2, name: "Item 2" }, ], }; }, methods: { onDragEnd() { console.log("排序后的列表:", this.list); }, }, }; .item { padding: 10px; margin: 5px; background-color: #f0f0f0; } ```

优势:

  • 支持列表拖拽排序。
  • 提供动画和触摸设备支持。
  • 通过 v-model 直接绑定数据。

自定义拖拽逻辑

若需更精细控制(如限制拖拽区域),可结合鼠标事件实现:

<template>
  <div
    class="draggable-box"
    :style="{ left: position.x + 'px', top: position.y + 'px' }"
    @mousedown="startDrag"
  ></div>
</template>

<script>
export default {
  data() {
    return {
      position: { x: 0, y: 0 },
      isDragging: false,
      startPos: { x: 0, y: 0 },
    };
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startPos = { x: e.clientX - this.position.x, y: e.clientY - this.position.y };
      document.addEventListener("mousemove", this.onDrag);
      document.addEventListener("mouseup", this.stopDrag);
    },
    onDrag(e) {
      if (!this.isDragging) return;
      this.position = {
        x: e.clientX - this.startPos.x,
        y: e.clientY - this.startPos.y,
      };
    },
    stopDrag() {
      this.isDragging = false;
      document.removeEventListener("mousemove", this.onDrag);
      document.removeEventListener("mouseup", this.stopDrag);
    },
  },
};
</script>

注意事项:

  • 监听 document 事件以避免拖拽中断。
  • 计算偏移量时需减去初始点击位置。

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

相关文章

vue实现多选div

vue实现多选div

实现多选 DIV 的基本思路 在 Vue 中实现多选 DIV 功能,可以通过以下方法实现。主要思路是利用 v-model 绑定选中状态,结合 CSS 类名动态切换样式。 数据准备与模板结构 定义一个…

vue computed实现

vue computed实现

计算属性的基本用法 在Vue中,计算属性通过computed选项定义,用于声明依赖于其他属性的动态值。计算属性基于它们的依赖进行缓存,只有依赖发生变化时才会重新计算。 new Vue({ dat…

vue 实现modal

vue 实现modal

Vue 实现 Modal 的方法 使用 Vue 原生组件 通过 Vue 的组件系统可以轻松实现 Modal。创建一个可复用的 Modal 组件,通过 props 控制显示与隐藏。 <templ…

vue实现addclass

vue实现addclass

Vue 实现动态添加 class 的方法 在 Vue 中动态添加 class 可以通过多种方式实现,以下是常见的几种方法: 使用对象语法 通过绑定一个对象到 :class,可以动态切换 class…

vue实现pwa

vue实现pwa

Vue 实现 PWA 的步骤 Vue 结合 PWA(Progressive Web App)可以创建离线可用的 Web 应用。以下是实现方法: 安装 Vue CLI 并创建项目 确保已安装 Vue…

vue 分页 实现

vue 分页 实现

Vue 分页实现方法 使用第三方库(如 Element UI) Element UI 提供了现成的分页组件 el-pagination,适合快速集成。 安装 Element UI: npm ins…