当前位置:首页 > VUE

vue怎么实现拖动

2026-01-18 17:10:31VUE

Vue 实现拖动的常用方法

使用 HTML5 原生拖放 API

HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件实现基础拖动功能。适用于简单场景。

<template>
  <div 
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
  >
    可拖动元素
  </div>
  <div 
    @dragover.prevent
    @drop="handleDrop"
  >
    放置区域
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', '拖动的数据');
    },
    handleDrop(e) {
      const data = e.dataTransfer.getData('text/plain');
      console.log('接收到的数据:', data);
    }
  }
}
</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('拖动后的列表:', this.list);
    }
  }
}
</script>

使用自定义指令实现拖动

对于需要高度定制的拖动需求,可以创建自定义指令:

vue怎么实现拖动

<template>
  <div v-draggable class="draggable-box">
    自定义指令实现拖动
  </div>
</template>

<script>
export default {
  directives: {
    draggable: {
      inserted(el) {
        el.style.position = 'absolute';
        let startX, startY, initialX, initialY;

        el.addEventListener('mousedown', (e) => {
          startX = e.clientX;
          startY = e.clientY;
          initialX = el.offsetLeft;
          initialY = el.offsetTop;
          document.addEventListener('mousemove', move);
          document.addEventListener('mouseup', stop);
        });

        function move(e) {
          el.style.left = `${initialX + e.clientX - startX}px`;
          el.style.top = `${initialY + e.clientY - startY}px`;
        }

        function stop() {
          document.removeEventListener('mousemove', move);
          document.removeEventListener('mouseup', stop);
        }
      }
    }
  }
}
</script>

注意事项

  • 移动端需要额外处理触摸事件(touchstart/touchmove/touchend)
  • 复杂的拖动交互建议使用成熟库如 interact.js 或拖拽专用库
  • 性能敏感场景注意节流处理拖动事件
  • 无障碍访问需要补充键盘操作支持

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

相关文章

vue穿梭框组件实现

vue穿梭框组件实现

实现基础穿梭框组件 在Vue中实现穿梭框组件,可以使用<el-transfer>(Element UI)或手动实现。以下是手动实现的核心逻辑: <template> &l…

vue实现switch

vue实现switch

Vue 实现 Switch 开关组件 在 Vue 中实现 Switch 开关组件可以通过自定义组件或使用现有 UI 库完成。以下是几种常见实现方式: 自定义 Switch 组件 创建一个基础 Sw…

vue 实现遮罩

vue 实现遮罩

Vue 实现遮罩层的方法 使用固定定位和透明背景 在Vue中实现遮罩层可以通过CSS固定定位结合透明背景色完成。创建一个全屏遮罩组件,利用position: fixed覆盖整个视窗。 <tem…

vue实现发帖

vue实现发帖

使用 Vue 实现发帖功能 前端实现 创建发帖表单组件,包含标题和内容输入框,以及提交按钮。使用 v-model 绑定表单数据。 <template> <div>…

vue实现绘图

vue实现绘图

Vue 实现绘图的方法 在 Vue 中实现绘图功能,可以通过多种方式实现,包括使用原生 HTML5 Canvas、第三方库(如 Fabric.js、Konva.js)或 SVG。以下是几种常见的实现方…

vue sku 实现

vue sku 实现

Vue SKU 实现方案 在电商系统中,SKU(Stock Keeping Unit)是商品的最小库存单位,通常由多个属性组合而成(如颜色、尺寸等)。以下是基于 Vue 的实现方案。 数据结构设计…