当前位置:首页 > VUE

vue实现自由拖拽

2026-01-17 13:59:59VUE

Vue 实现自由拖拽的方法

使用 HTML5 原生拖拽 API

HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。

<template>
  <div 
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
    @dragover="handleDragOver"
    @drop="handleDrop"
  >
    拖拽元素
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id);
    },
    handleDragOver(e) {
      e.preventDefault();
    },
    handleDrop(e) {
      e.preventDefault();
      const data = e.dataTransfer.getData('text/plain');
      const draggedElement = document.getElementById(data);
      e.target.appendChild(draggedElement);
    },
    handleDragEnd(e) {
      // 拖拽结束后的处理
    }
  }
}
</script>

使用第三方库 vue-draggable

vue-draggable 是基于 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' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽结束');
    }
  }
}
</script>

自定义拖拽实现

通过鼠标事件实现更自由的拖拽效果。

<template>
  <div 
    ref="dragElement"
    @mousedown="startDrag"
    @mousemove="onDrag"
    @mouseup="stopDrag"
    :style="dragStyle"
  >
    可拖拽元素
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDragging: false,
      startX: 0,
      startY: 0,
      offsetX: 0,
      offsetY: 0
    };
  },
  computed: {
    dragStyle() {
      return {
        position: 'absolute',
        left: `${this.offsetX}px`,
        top: `${this.offsetY}px`,
        cursor: this.isDragging ? 'grabbing' : 'grab'
      };
    }
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startX = e.clientX;
      this.startY = e.clientY;
    },
    onDrag(e) {
      if (!this.isDragging) return;
      this.offsetX += e.clientX - this.startX;
      this.offsetY += e.clientY - this.startY;
      this.startX = e.clientX;
      this.startY = e.clientY;
    },
    stopDrag() {
      this.isDragging = false;
    }
  }
}
</script>

使用 Vue 指令实现拖拽

封装一个自定义指令来实现拖拽功能。

vue实现自由拖拽

<template>
  <div v-draggable class="drag-box">
    通过指令实现的拖拽元素
  </div>
</template>

<script>
export default {
  directives: {
    draggable: {
      inserted(el) {
        el.style.position = 'absolute';
        el.style.cursor = 'move';

        let offsetX, offsetY;

        el.addEventListener('mousedown', (e) => {
          offsetX = e.clientX - el.getBoundingClientRect().left;
          offsetY = e.clientY - el.getBoundingClientRect().top;

          function move(e) {
            el.style.left = `${e.clientX - offsetX}px`;
            el.style.top = `${e.clientY - offsetY}px`;
          }

          document.addEventListener('mousemove', move);

          document.addEventListener('mouseup', () => {
            document.removeEventListener('mousemove', move);
          }, { once: true });
        });
      }
    }
  }
}
</script>

注意事项

  • 拖拽性能优化:对于复杂元素,考虑使用 transform 代替 left/top 定位
  • 边界处理:添加边界检测防止元素被拖出可视区域
  • 移动端适配:需要处理 touchstarttouchmove 等触摸事件
  • 嵌套拖拽:在复杂场景中需要考虑父子元素的拖拽关系

标签: 拖拽自由
分享给朋友:

相关文章

vue实现carousel拖拽

vue实现carousel拖拽

实现拖拽轮播的基本思路 在Vue中实现可拖拽的Carousel组件需要结合触摸事件(touchstart、touchmove、touchend)和鼠标事件(mousedown、mousemove、mo…

div拖拽实现vue

div拖拽实现vue

实现 Vue 中的 div 拖拽功能 在 Vue 中实现 div 拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 完成。以下是两种方法的详细实现: 使用 H…

vue 实现拖拽布局

vue 实现拖拽布局

Vue 实现拖拽布局的方法 使用原生HTML5拖拽API 通过HTML5的draggable属性和Vue的事件绑定实现基础拖拽功能。在元素上添加draggable="true",并通过@dragsta…

vue 实现财务自由

vue 实现财务自由

Vue 实现财务自由的路径 通过 Vue 技术实现财务自由,核心在于将技术能力转化为可持续的收入来源。以下是几种常见的方法: 开发高需求 Vue 项目或产品 构建基于 Vue 的 SaaS 工具、企…

vue实现拖拽互换

vue实现拖拽互换

Vue 实现拖拽互换 在 Vue 中实现拖拽互换功能可以通过原生 HTML5 的拖放 API 或第三方库如 vuedraggable 来完成。以下是两种方法的实现方式: 使用 HTML5 拖放 AP…

vue日历拖拽实现

vue日历拖拽实现

Vue 日历拖拽实现方案 使用 vue-draggable 库 安装依赖库: npm install vuedraggable 基础拖拽日历实现代码: <template> <…