当前位置:首页 > VUE

vue 实现拖拽功能

2026-01-17 00:01:10VUE

Vue 实现拖拽功能的方法

使用 HTML5 原生拖拽 API

HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstartdragenddragoverdrop 事件实现基础拖拽功能。

<template>
  <div 
    draggable="true"
    @dragstart="handleDragStart"
    @dragover.prevent
    @drop="handleDrop"
  >
    拖拽元素
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id);
    },
    handleDrop(e) {
      const id = e.dataTransfer.getData('text/plain');
      const draggableElement = document.getElementById(id);
      e.target.appendChild(draggableElement);
    }
  }
};
</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>

自定义拖拽指令

通过 Vue 自定义指令实现更灵活的拖拽控制。

<template>
  <div v-draggable>可拖拽元素</div>
</template>

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

        el.addEventListener('dragstart', (e) => {
          e.dataTransfer.setData('text/plain', el.id);
        });
      }
    }
  }
};
</script>

拖拽限制与边界控制

添加边界检查和拖拽范围限制。

methods: {
  handleDragOver(e) {
    const rect = e.target.getBoundingClientRect();
    const x = e.clientX - rect.left;
    const y = e.clientY - rect.top;

    // 限制在容器内拖拽
    if (x < 0 || y < 0 || x > rect.width || y > rect.height) {
      return false;
    }
    e.target.style.left = `${x}px`;
    e.target.style.top = `${y}px`;
  }
}

拖拽数据同步

在拖拽过程中实时更新 Vue 数据模型。

vue 实现拖拽功能

data() {
  return {
    items: [],
    draggedItem: null
  };
},
methods: {
  handleDragStart(item) {
    this.draggedItem = item;
  },
  handleDrop(targetIndex) {
    if (this.draggedItem) {
      const draggedIndex = this.items.indexOf(this.draggedItem);
      this.items.splice(targetIndex, 0, this.items.splice(draggedIndex, 1)[0]);
    }
  }
}

以上方法可根据具体需求选择使用,HTML5 原生 API 适合简单场景,Vue.Draggable 适合列表排序,自定义指令则提供最大灵活性。

标签: 拖拽功能
分享给朋友:

相关文章

vue实现拖拽实现布局

vue实现拖拽实现布局

Vue 实现拖拽布局的方法 使用 Vue.Draggable 库 Vue.Draggable 是基于 Sortable.js 的 Vue 组件,适合实现列表或网格的拖拽排序。 安装依赖: npm…

vue拖拽容器实现

vue拖拽容器实现

Vue 拖拽容器实现方法 在 Vue 中实现拖拽容器功能可以通过原生 HTML5 的拖放 API 或第三方库如 vuedraggable 来实现。以下是两种方法的详细说明。 使用 HTML5 拖放…

php秒杀功能的实现

php秒杀功能的实现

秒杀功能的核心设计 高并发场景下秒杀系统的核心在于解决超卖问题和性能瓶颈。需要结合缓存、队列、锁机制等技术实现。 数据库设计 商品表需包含库存字段,例如: CREATE TABLE `seckil…

h5能实现抽题功能吗

h5能实现抽题功能吗

H5实现抽题功能的技术方案 H5完全能够实现抽题功能,主要通过前端技术结合后端数据交互完成。以下是具体实现方式: 前端技术实现 HTML5结合JavaScript可以动态生成和展示题目,利用DOM操…

vue 分页功能实现

vue 分页功能实现

分页功能实现方法 使用 Element UI 的分页组件 Element UI 提供了现成的分页组件 el-pagination,可以快速实现分页功能。 安装 Element UI: npm in…

vue的功能实现

vue的功能实现

Vue 核心功能实现 Vue.js 是一个渐进式 JavaScript 框架,其核心功能主要包括数据绑定、组件化、虚拟 DOM 和响应式系统。以下从不同层面解析其实现原理: 响应式系统 Vue 2.…