当前位置:首页 > VUE

vue实现dom拖拽

2026-03-10 10:47:43VUE

Vue 实现 DOM 拖拽

在 Vue 中实现 DOM 元素的拖拽功能,可以通过原生 HTML5 的拖拽 API 或第三方库(如 vuedraggable)来完成。以下是两种常见的实现方式:

使用 HTML5 拖拽 API

HTML5 提供了原生的拖拽事件,可以直接在 Vue 中绑定这些事件来实现拖拽功能。

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

<script>
export default {
  methods: {
    handleDragStart(event) {
      event.dataTransfer.setData('text/plain', event.target.id);
      event.target.style.opacity = '0.4';
    },
    handleDragEnd(event) {
      event.target.style.opacity = '1';
    },
  },
};
</script>

使用 vuedraggable

vuedraggable 是一个基于 Sortable.js 的 Vue 拖拽库,适合实现列表拖拽排序等功能。

安装依赖:

npm install vuedraggable

示例代码:

<template>
  <draggable v-model="list" @end="onDragEnd">
    <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' },
        { id: 3, name: 'Item 3' },
      ],
    };
  },
  methods: {
    onDragEnd(event) {
      console.log('拖拽结束,新顺序:', this.list);
    },
  },
};
</script>

自定义拖拽实现

如果需要更灵活的拖拽逻辑,可以通过监听鼠标事件(mousedownmousemovemouseup)实现自定义拖拽。

vue实现dom拖拽

<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(event) {
      this.isDragging = true;
      this.startPos = {
        x: event.clientX - this.position.x,
        y: event.clientY - this.position.y,
      };
      document.addEventListener('mousemove', this.onDrag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    onDrag(event) {
      if (this.isDragging) {
        this.position = {
          x: event.clientX - this.startPos.x,
          y: event.clientY - this.startPos.y,
        };
      }
    },
    stopDrag() {
      this.isDragging = false;
      document.removeEventListener('mousemove', this.onDrag);
      document.removeEventListener('mouseup', this.stopDrag);
    },
  },
};
</script>

注意事项

  • 使用原生拖拽 API 时,注意跨浏览器兼容性。
  • vuedraggable 适合列表排序,但可能不适用于自由拖拽场景。
  • 自定义拖拽实现时,需注意事件绑定和解绑的时机,避免内存泄漏。

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

相关文章

vue实现handsontable

vue实现handsontable

Vue 中实现 Handsontable 要在 Vue 项目中集成 Handsontable,可以使用官方提供的 @handsontable/vue 封装库。以下是一个完整的实现步骤。 安装依赖 确…

vue实现长按

vue实现长按

Vue 实现长按功能的方法 在 Vue 中实现长按功能可以通过原生事件监听或自定义指令完成。以下是几种常见实现方式: 使用原生事件监听 通过 @mousedown 和 @mouseup 或 @tou…

实现vue datepicker

实现vue datepicker

安装依赖 使用 vue-datepicker 或第三方库如 v-calendar 或 vue2-datepicker。以 vue2-datepicker 为例: npm install vue2…

vue实现mvvm

vue实现mvvm

Vue 实现 MVVM 模式 MVVM(Model-View-ViewModel)是一种前端架构模式,Vue 是其典型实现之一。MVVM 的核心是通过数据绑定和响应式系统实现视图与数据的自动同步。…

vue实现循环

vue实现循环

Vue 实现循环的方法 在 Vue 中,可以通过 v-for 指令实现循环渲染列表或对象。以下是几种常见的用法: 遍历数组 使用 v-for 遍历数组时,可以同时获取当前项和索引: <ul&…

vue实现门户

vue实现门户

Vue 实现门户网站的关键步骤 搭建基础框架 使用 Vue CLI 或 Vite 初始化项目,安装 Vue Router 管理多页面路由。门户通常需要响应式布局,可引入 UI 库如 Element P…