当前位置:首页 > VUE

vue 实现div拖拽

2026-02-18 11:26:04VUE

Vue 实现 Div 拖拽的方法

使用原生 HTML5 拖拽 API

在 Vue 中可以通过 HTML5 的拖拽 API 实现基本拖拽功能。主要涉及 draggable 属性以及 dragstartdragend 等事件。

<template>
  <div 
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
    class="draggable-item"
  >
    拖拽我
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', 'drag-data');
      e.target.style.opacity = '0.5';
    },
    handleDragEnd(e) {
      e.target.style.opacity = '1';
    }
  }
}
</script>

使用 Vue Draggable 库

对于更复杂的拖拽需求,推荐使用 vuedraggable 库。该库基于 Sortable.js 实现,支持列表排序、跨列表拖拽等功能。

安装依赖:

npm install vuedraggable

示例代码:

<template>
  <draggable 
    v-model="list"
    @start="dragStart"
    @end="dragEnd"
  >
    <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' },
        { id: 2, name: 'Item 2' }
      ]
    }
  },
  methods: {
    dragStart() {
      console.log('拖拽开始');
    },
    dragEnd() {
      console.log('拖拽结束');
    }
  }
}
</script>

自定义拖拽实现

对于需要完全自定义的拖拽行为,可以通过鼠标事件手动实现:

<template>
  <div 
    ref="draggable"
    class="draggable-item"
    @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.onDrag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    onDrag(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.onDrag);
      document.removeEventListener('mouseup', this.stopDrag);
    }
  }
}
</script>

<style>
.draggable-item {
  position: absolute;
  cursor: move;
  user-select: none;
}
</style>

注意事项

  1. 使用原生拖拽 API 时需要注意浏览器兼容性问题
  2. 自定义拖拽实现时,要确保在组件销毁时移除事件监听
  3. 移动端支持需要额外处理 touch 事件
  4. 拖拽性能优化可以考虑节流或防抖处理

以上方法可以根据具体需求选择使用,简单场景可用原生 API,复杂交互推荐使用 vuedraggable 库。

vue 实现div拖拽

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

相关文章

vue单页面实现登录

vue单页面实现登录

实现登录功能的基本流程 在Vue单页面应用中实现登录功能,通常需要以下几个关键步骤: 创建登录表单组件 使用Vue的模板语法创建包含用户名和密码输入框的表单,并绑定数据到组件的data属性。 <…

vue datepicker 实现

vue datepicker 实现

实现 Vue Datepicker 的基本方法 在 Vue 项目中实现日期选择功能,可以使用第三方库如 vue-datepicker 或 v-calendar。以下是两种常见实现方式: 安装 vu…

vue评分实现

vue评分实现

Vue 评分组件实现方法 使用第三方库(如 Element UI) 安装 Element UI: npm install element-ui 引入并注册组件: import Vue from…

vue实现节流

vue实现节流

vue实现节流的方法 在Vue中实现节流(throttle)功能,通常用于限制高频事件的触发频率,例如滚动、输入或按钮点击。以下是几种常见的实现方式: 使用Lodash的throttle函数 安装…

vue实现定时

vue实现定时

Vue 实现定时功能的方法 使用 setInterval 和 clearInterval 在 Vue 中可以通过 setInterval 和 clearInterval 实现定时功能。在组件的 mou…

vue首页实现

vue首页实现

实现Vue首页的基本步骤 创建一个Vue首页通常涉及项目初始化、页面结构设计、路由配置和组件开发。以下是具体实现方法: 初始化Vue项目 使用Vue CLI或Vite快速搭建项目结构: np…