当前位置:首页 > VUE

vue实现页面拖拽布局

2026-02-23 14:25:13VUE

Vue 实现页面拖拽布局的方法

使用 Vue.Draggable 库

Vue.Draggable 是基于 Sortable.js 的 Vue 组件,适用于列表拖拽排序和布局调整。安装方式如下:

npm install vuedraggable

基本用法示例:

vue实现页面拖拽布局

<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>

使用原生 HTML5 Drag and Drop API

对于更基础的拖拽需求,可直接使用 HTML5 API 实现:

vue实现页面拖拽布局

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

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

使用 Grid 布局拖拽

结合 CSS Grid 实现更复杂的拖拽布局:

<template>
  <div class="grid-container" ref="grid">
    <div 
      v-for="item in items"
      :key="item.id"
      class="grid-item"
      draggable="true"
      @dragstart="dragStart"
      @dragover.prevent
      @dragenter.prevent
      @drop="drop"
      :style="{ gridArea: item.area }"
    >
      {{ item.content }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, content: 'Box 1', area: '1 / 1 / 2 / 2' },
        { id: 2, content: 'Box 2', area: '1 / 2 / 2 / 3' }
      ],
      draggedItem: null
    }
  },
  methods: {
    dragStart(e) {
      this.draggedItem = e.target;
      e.dataTransfer.setData('text/plain', e.target.id);
    },
    drop(e) {
      const target = e.target;
      if (target !== this.draggedItem) {
        const tempArea = target.style.gridArea;
        target.style.gridArea = this.draggedItem.style.gridArea;
        this.draggedItem.style.gridArea = tempArea;
      }
    }
  }
}
</script>

<style>
.grid-container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
}
.grid-item {
  border: 1px solid #ccc;
  padding: 20px;
}
</style>

使用第三方 UI 库

Element UI、Ant Design Vue 等库提供现成的拖拽组件:

<template>
  <el-row :gutter="10">
    <el-col 
      v-for="(item, index) in list"
      :key="index"
      :span="6"
      v-dragging="{ item: item, list: list, group: 'item' }"
    >
      {{ item }}
    </el-col>
  </el-row>
</template>

<script>
export default {
  data() {
    return {
      list: ['Item 1', 'Item 2', 'Item 3']
    }
  },
  mounted() {
    this.$dragging.$on('dragged', ({ value }) => {
      console.log(value.item);
    });
  }
}
</script>

注意事项

  1. 移动端适配需额外处理 touch 事件
  2. 复杂场景建议使用专业库如 interact.js
  3. 拖拽性能优化可考虑虚拟滚动技术
  4. 持久化布局状态应配合 localStorage 或后端存储

以上方法可根据具体需求选择实现方案,Vue.Draggable 适合大多数简单场景,HTML5 API 提供更底层控制,Grid 布局适合响应式设计,UI 库方案则提供开箱即用体验。

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

相关文章

vue实现拖拽改变尺寸

vue实现拖拽改变尺寸

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

vue如何实现两栏布局

vue如何实现两栏布局

使用Flexbox实现两栏布局 Flexbox是CSS3中强大的布局方式,可以轻松实现两栏布局。在Vue中可以直接在组件的style标签中使用。 <template> <div…

uniapp布局样式

uniapp布局样式

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

uniapp布局规范

uniapp布局规范

uniapp布局规范 uniapp的布局规范基于Flexbox模型,支持跨平台开发,需兼顾不同设备的适配性。以下是核心布局要点: Flex布局基础 使用Flexbox实现弹性布局,默认display…

jquery 拖拽

jquery 拖拽

jQuery 拖拽实现方法 使用 jQuery 实现拖拽功能可以通过多种方式完成,以下是常见的几种方法: 使用 jQuery UI 的拖拽功能 jQuery UI 提供了 draggable 方法…

vue实现拆分拖拽

vue实现拆分拖拽

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