当前位置:首页 > VUE

Vue实现拖拽布局

2026-01-16 22:59:56VUE

Vue 实现拖拽布局的方法

使用 HTML5 原生拖拽 API

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

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

<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3'],
      draggedIndex: null
    };
  },
  methods: {
    handleDragStart(index, event) {
      this.draggedIndex = index;
      event.dataTransfer.setData('text/plain', index);
    },
    handleDrop(index, event) {
      const draggedIndex = this.draggedIndex;
      if (draggedIndex !== null) {
        const newItems = [...this.items];
        const [removed] = newItems.splice(draggedIndex, 1);
        newItems.splice(index, 0, removed);
        this.items = newItems;
      }
    }
  }
};
</script>

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,提供了更简单的拖拽实现方式。

安装依赖:

Vue实现拖拽布局

npm install vuedraggable

示例代码:

<template>
  <draggable v-model="items" @end="onDragEnd">
    <div v-for="(item, index) in items" :key="index">
      {{ item }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3']
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽完成', this.items);
    }
  }
};
</script>

实现网格拖拽布局

对于网格布局的拖拽,可以使用 vue-grid-layout 库。

Vue实现拖拽布局

安装依赖:

npm install vue-grid-layout

示例代码:

<template>
  <grid-layout
    :layout="layout"
    :col-num="12"
    :row-height="30"
    @layout-updated="layoutUpdated"
  >
    <grid-item
      v-for="item in layout"
      :key="item.i"
      :x="item.x"
      :y="item.y"
      :w="item.w"
      :h="item.h"
      :i="item.i"
    >
      {{ 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: 2, i: '1' },
        { x: 4, y: 0, w: 2, h: 2, i: '2' }
      ]
    };
  },
  methods: {
    layoutUpdated(newLayout) {
      this.layout = newLayout;
    }
  }
};
</script>

自定义拖拽逻辑

如果需要更复杂的拖拽逻辑,可以结合 Vue 的响应式数据和事件系统实现自定义拖拽。

<template>
  <div class="container">
    <div
      v-for="(item, index) in items"
      :key="index"
      class="draggable-item"
      :style="{ left: item.x + 'px', top: item.y + 'px' }"
      @mousedown="startDrag(index, $event)"
      @mousemove="onDrag($event)"
      @mouseup="stopDrag"
    >
      {{ item.text }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { text: 'Item 1', x: 0, y: 0 },
        { text: 'Item 2', x: 100, y: 0 },
        { text: 'Item 3', x: 200, y: 0 }
      ],
      dragging: false,
      currentIndex: null,
      startX: 0,
      startY: 0
    };
  },
  methods: {
    startDrag(index, event) {
      this.dragging = true;
      this.currentIndex = index;
      this.startX = event.clientX - this.items[index].x;
      this.startY = event.clientY - this.items[index].y;
    },
    onDrag(event) {
      if (this.dragging) {
        const newItems = [...this.items];
        newItems[this.currentIndex].x = event.clientX - this.startX;
        newItems[this.currentIndex].y = event.clientY - this.startY;
        this.items = newItems;
      }
    },
    stopDrag() {
      this.dragging = false;
    }
  }
};
</script>

<style>
.container {
  position: relative;
  width: 100%;
  height: 300px;
  border: 1px solid #ccc;
}
.draggable-item {
  position: absolute;
  width: 100px;
  height: 50px;
  background: #eee;
  border: 1px solid #999;
  cursor: move;
}
</style>

以上方法可以根据需求选择适合的方案实现拖拽布局,从简单的列表拖拽到复杂的网格布局均可覆盖。

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

相关文章

elementui响应式布局

elementui响应式布局

响应式布局基础概念 响应式布局指页面能够根据屏幕尺寸自动调整结构和样式,确保在不同设备上呈现良好的用户体验。Element UI 基于 Vue.js,其组件默认支持响应式设计,但需结合 CSS 媒体查…

uniapp布局样式

uniapp布局样式

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

前端vue实现拖拽

前端vue实现拖拽

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

vue 实现拖拽功能

vue 实现拖拽功能

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

vue实现拆分拖拽

vue实现拆分拖拽

Vue 实现拆分拖拽功能 拆分拖拽通常指将一个元素拆分为多个部分,并允许用户通过拖拽重新排列或组合这些部分。以下是实现这一功能的几种方法: 使用 Vue.Draggable 库 Vue.Dragga…

vue如何实现拖拽

vue如何实现拖拽

实现拖拽的基本方法 在Vue中实现拖拽功能通常使用HTML5的Drag and Drop API或第三方库如vuedraggable。以下是两种方法的详细说明。 使用HTML5 Drag and D…