当前位置:首页 > VUE

vue实现拖动布局

2026-02-19 19:31:44VUE

Vue 实现拖动布局的方法

使用 vuedraggable

vuedraggable 是基于 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>

使用 HTML5 原生拖拽 API

通过原生 draggable 属性和事件实现基础拖拽功能。

示例代码:

<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: 'Box 1' },
        { id: 2, text: 'Box 2' }
      ],
      draggedItem: null
    };
  },
  methods: {
    handleDragStart(e, item) {
      this.draggedItem = item;
      e.dataTransfer.effectAllowed = 'move';
    },
    handleDrop(e, targetItem) {
      if (this.draggedItem !== targetItem) {
        const fromIndex = this.items.indexOf(this.draggedItem);
        const toIndex = this.items.indexOf(targetItem);
        this.items.splice(fromIndex, 1);
        this.items.splice(toIndex, 0, this.draggedItem);
      }
    }
  }
};
</script>

使用 interact.js 实现自由拖拽

适合需要自由拖动和调整大小的场景。

安装依赖:

npm install interactjs

示例代码:

<template>
  <div ref="dragElement" class="draggable-box">Drag me</div>
</template>

<script>
import interact from 'interactjs';
export default {
  mounted() {
    interact(this.$refs.dragElement)
      .draggable({
        onmove: (event) => {
          const target = event.target;
          const x = (parseFloat(target.style.left) || 0) + event.dx;
          const y = (parseFloat(target.style.top) || 0) + event.dy;
          target.style.left = `${x}px`;
          target.style.top = `${y}px`;
        }
      });
  }
};
</script>

<style>
.draggable-box {
  position: absolute;
  width: 100px;
  height: 100px;
  background: #eee;
  cursor: move;
}
</style>

使用 vue-drag-resize 实现拖拽和缩放

适用于需要同时支持拖拽和调整大小的组件。

安装依赖:

npm install vue-drag-resize

示例代码:

vue实现拖动布局

<template>
  <VueDragResize 
    :w="200" :h="200" 
    @dragging="onDrag" 
    @resizing="onResize"
  >
    Content
  </VueDragResize>
</template>

<script>
import VueDragResize from 'vue-drag-resize';
export default {
  components: { VueDragResize },
  methods: {
    onDrag(newRect) {
      console.log('新位置:', newRect.left, newRect.top);
    },
    onResize(newRect) {
      console.log('新尺寸:', newRect.width, newRect.height);
    }
  }
};
</script>

注意事项

  • 移动端兼容性需要额外处理触摸事件(如 touchstart/touchmove)。
  • 复杂场景建议优先选择成熟的库(如 vuedraggableinteract.js)。
  • 性能优化:对于大量可拖拽元素,建议使用虚拟滚动技术。

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

相关文章

vue如何实现拖动

vue如何实现拖动

Vue 实现拖动的常用方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件实现拖动功能。 <template>…

vue实现响应式布局

vue实现响应式布局

实现响应式布局的核心方法 Vue结合CSS媒体查询和弹性布局实现响应式设计。通过监听窗口尺寸变化动态调整布局结构,确保在不同设备上呈现最佳效果。 使用CSS媒体查询 创建响应式样式表,定义不同屏幕尺…

拖拽布局实现原理vue

拖拽布局实现原理vue

拖拽布局的实现原理 拖拽布局的核心是通过监听鼠标或触摸事件,动态调整元素的位置和尺寸。在Vue中,通常结合HTML5的拖拽API或第三方库(如vuedraggable)实现。 基本实现步骤 事件监听…

vue拖拽布局实现原理

vue拖拽布局实现原理

Vue拖拽布局的实现原理 Vue拖拽布局的核心原理基于HTML5的Drag and Drop API或第三方库(如Sortable.js、Vue.Draggable),通过数据驱动视图更新实现动态布局…

vue实现边框高度拖动

vue实现边框高度拖动

实现边框高度拖动的核心思路 通过监听鼠标事件(mousedown、mousemove、mouseup)来实现拖动效果。在Vue中结合自定义指令或组件封装更为优雅。 基础实现方案(基于自定义指令) &…

vue实现拖动放大缩小

vue实现拖动放大缩小

实现拖动放大缩小的基本思路 在Vue中实现元素的拖动和放大缩小功能,通常需要结合鼠标事件和CSS变换。通过监听鼠标的按下、移动和释放事件,计算元素的位移和缩放比例,最终应用到元素的transform属…