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

自定义拖拽实现

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

vue 实现div拖拽

<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
分享给朋友:

相关文章

jquery实现vue

jquery实现vue

jQuery 和 Vue.js 是两种不同理念的前端工具,jQuery 以 DOM 操作和事件驱动为核心,而 Vue.js 是数据驱动的现代化框架。如果想用 jQuery 实现类似 Vue 的功能(如…

vue实现路由

vue实现路由

Vue 路由的实现方法 Vue 路由可以通过 Vue Router 库来实现,Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue Router 通…

vue实现流程转化

vue实现流程转化

Vue 实现流程转化 在 Vue 中实现流程转化通常涉及多个步骤,包括状态管理、组件通信和动态渲染。以下是几种常见的实现方法: 使用 Vuex 进行状态管理 Vuex 是 Vue 的官方状态管理库,…

vue如何实现计算

vue如何实现计算

Vue 实现计算的方法 Vue 提供了多种方式来实现计算逻辑,包括计算属性、方法、侦听器等。以下是几种常见的实现方式: 计算属性(Computed Properties) 计算属性是基于它们的响应式…

vue实现图片查看

vue实现图片查看

Vue 实现图片查看功能 在 Vue 中实现图片查看功能,可以通过原生实现或使用第三方库。以下是几种常见的方法: 原生实现方式 使用 Vue 的指令和事件绑定实现基础的图片查看功能。 <te…

vue实现数据删除

vue实现数据删除

vue实现数据删除的方法 使用v-for和v-on指令 在Vue中可以通过v-for指令渲染列表数据,结合v-on指令监听删除事件。定义一个方法处理删除逻辑,通常使用splice方法从数组中移除指定项…