当前位置:首页 > 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):

  1. 安装依赖:

    npm install vuedraggable
  2. 实现代码:

    
    <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>

注意事项:

vue实现div拖拽

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

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

相关文章

vue实现路由导航

vue实现路由导航

路由导航的实现方式 在Vue中,路由导航主要通过Vue Router实现。Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。 基本路由配置 安装Vue Router后…

vue实现前端注册

vue实现前端注册

Vue 实现前端注册功能 注册表单设计 使用 Vue 的模板语法创建注册表单,包含用户名、邮箱、密码和确认密码字段。表单需绑定 v-model 实现双向数据绑定。 <template>…

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 使用window.print()方法 这是最简单的打印方式,直接调用浏览器的打印功能。 meth…

vue 实现递归

vue 实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据,例如菜单、评论列表或文件目录。以下是实现递归组件的关键步骤: 定义递归组件 递归组件需要设置 name 属性,以便在模…

vue实现签章

vue实现签章

Vue 实现签章功能 签章功能通常包括手写签名、电子印章等。以下是基于 Vue 的实现方法: 使用 canvas 实现手写签名 安装依赖(如需要): npm install signature_p…

轮播vue实现

轮播vue实现

使用 Vue 实现轮播功能 基础轮播实现 安装依赖(如使用 Swiper): npm install swiper vue-awesome-swiper 组件代码示例: <templ…