当前位置:首页 > VUE

vue拖拽布局实现方案

2026-01-21 15:52:35VUE

Vue 拖拽布局实现方案

使用第三方库(推荐)

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,适用于列表拖拽排序和布局调整。安装后可直接在模板中使用,支持跨列表拖拽、动画效果和自定义拖拽手柄。

npm install vuedraggable
<template>
  <draggable v-model="list" group="items" @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>

原生 HTML5 拖拽 API

通过 HTML5 的 draggable 属性和 Vue 事件绑定实现基础拖拽功能。需要手动处理拖拽状态和数据更新,适合简单场景。

vue拖拽布局实现方案

<template>
  <div 
    v-for="item in list" 
    :key="item.id"
    draggable="true"
    @dragstart="handleDragStart($event, item)"
    @dragover.prevent
    @drop="handleDrop($event, item)"
  >
    {{ item.name }}
  </div>
</template>

<script>
export default {
  data() {
    return { 
      list: [...],
      draggedItem: null
    };
  },
  methods: {
    handleDragStart(e, item) {
      this.draggedItem = item;
      e.dataTransfer.effectAllowed = 'move';
    },
    handleDrop(e, targetItem) {
      const index = this.list.indexOf(this.draggedItem);
      this.list.splice(index, 1);
      const targetIndex = this.list.indexOf(targetItem);
      this.list.splice(targetIndex, 0, this.draggedItem);
    }
  }
};
</script>

网格布局拖拽(如 Grid Layout)

vue-grid-layout 专为响应式网格拖拽设计,支持栅格化布局和动态调整尺寸。适用于仪表盘等复杂场景。

vue拖拽布局实现方案

npm install vue-grid-layout
<template>
  <grid-layout
    :layout.sync="layout"
    :col-num="12"
    :row-height="30"
    :is-draggable="true"
  >
    <grid-item v-for="item in layout" :key="item.i" :x="item.x" :y="item.y" :w="item.w" :h="item.h">
      {{ item.i }}
    </grid-item>
  </grid-layout>
</template>

<script>
import { GridLayout, GridItem } from 'vue-grid-layout';
export default {
  components: { GridLayout, GridItem },
  data() {
    return {
      layout: [
        { x: 0, y: 0, w: 2, h: 2, i: '0' },
        { x: 2, y: 0, w: 2, h: 4, i: '1' }
      ]
    };
  }
};
</script>

拖拽性能优化

对于大型列表,使用 v-for 时应结合 key 和虚拟滚动(如 vue-virtual-scroller)。避免直接操作 DOM,通过 Vue 的响应式数据驱动视图更新。

自定义拖拽逻辑

通过监听 touchstart/mousedowntouchmove/mousemovetouchend/mouseup 事件,计算元素位移并动态修改样式。需注意移动端兼容性和事件冒泡处理。

methods: {
  startDrag(e) {
    this.initialX = e.clientX - this.$el.getBoundingClientRect().left;
    this.initialY = e.clientY - this.$el.getBoundingClientRect().top;
    document.addEventListener('mousemove', this.drag);
    document.addEventListener('mouseup', this.endDrag);
  },
  drag(e) {
    this.$el.style.left = `${e.clientX - this.initialX}px`;
    this.$el.style.top = `${e.clientY - this.initialY}px`;
  },
  endDrag() {
    document.removeEventListener('mousemove', this.drag);
    document.removeEventListener('mouseup', this.endDrag);
  }
}

标签: 布局拖拽
分享给朋友:

相关文章

vue拖拽实现

vue拖拽实现

Vue 拖拽实现方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop 事…

vue实现图标拖拽

vue实现图标拖拽

Vue 实现图标拖拽 使用 HTML5 拖放 API 在 Vue 中实现图标拖拽可以利用 HTML5 的拖放 API。通过 draggable 属性标记可拖拽元素,并监听 dragstart、drag…

vue实现拖拽改变尺寸

vue实现拖拽改变尺寸

Vue 实现拖拽改变尺寸的方法 使用原生 HTML5 拖拽 API 通过监听 mousedown、mousemove 和 mouseup 事件实现拖拽改变尺寸。创建一个可拖拽的边界元素,调整目标元素的…

vue实现左右布局

vue实现左右布局

实现左右布局的方法 使用Vue实现左右布局可以通过多种方式完成,以下是几种常见的实现方法: 使用Flexbox布局 Flexbox是一种现代的CSS布局方式,可以轻松实现左右布局。 <tem…

uniapp布局样式

uniapp布局样式

uniapp布局样式基础 uniapp基于Vue.js框架,支持多种布局方式,包括Flex布局、Grid布局和传统盒模型布局。样式编写遵循CSS规范,同时支持rpx响应式单位。 Flex布局示例…

vue 实现拖拽甘特图

vue 实现拖拽甘特图

实现拖拽甘特图的核心思路 Vue 实现拖拽甘特图需要结合第三方库或自定义逻辑,核心功能包括任务条渲染、时间轴刻度、拖拽交互、数据绑定等。以下是具体实现方法: 使用第三方库(推荐) vue-gantt…