当前位置:首页 > VUE

vue实现拖动栏

2026-01-17 12:52:58VUE

Vue 实现拖动栏

使用 HTML5 拖放 API

HTML5 提供了原生的拖放 API,可以直接在 Vue 中使用。通过 draggable 属性标记可拖动元素,并监听 dragstartdragoverdrop 事件。

<template>
  <div>
    <div 
      draggable="true" 
      @dragstart="handleDragStart"
      @dragover.prevent
      @drop="handleDrop"
    >
      拖动元素
    </div>
    <div 
      @dragover.prevent
      @drop="handleDrop"
    >
      放置区域
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', 'drag-data');
    },
    handleDrop(e) {
      const data = e.dataTransfer.getData('text/plain');
      console.log('拖放数据:', data);
    }
  }
};
</script>

使用第三方库 Vue.Draggable

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

安装依赖:

npm install vuedraggable

使用示例:

<template>
  <div>
    <draggable 
      v-model="items" 
      @end="onDragEnd"
    >
      <div v-for="item in items" :key="item.id">
        {{ item.name }}
      </div>
    </draggable>
  </div>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖动结束,当前顺序:', this.items);
    }
  }
};
</script>

自定义拖动逻辑

如果需要更复杂的拖动逻辑,可以结合鼠标事件(mousedownmousemovemouseup)实现。

<template>
  <div>
    <div 
      class="draggable" 
      @mousedown="startDrag"
      :style="{ left: position.x + 'px', top: position.y + 'px' }"
    >
      拖动我
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      position: { x: 0, y: 0 },
      isDragging: false,
      startPos: { x: 0, y: 0 }
    };
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startPos = { x: e.clientX - this.position.x, y: e.clientY - this.position.y };
      document.addEventListener('mousemove', this.onDrag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    onDrag(e) {
      if (this.isDragging) {
        this.position.x = e.clientX - this.startPos.x;
        this.position.y = e.clientY - this.startPos.y;
      }
    },
    stopDrag() {
      this.isDragging = false;
      document.removeEventListener('mousemove', this.onDrag);
      document.removeEventListener('mouseup', this.stopDrag);
    }
  }
};
</script>

<style>
.draggable {
  position: absolute;
  cursor: move;
  background: #f0f0f0;
  padding: 10px;
  border: 1px solid #ccc;
}
</style>

实现拖动排序列表

结合 Vue 的响应式特性,可以轻松实现拖动排序功能。

vue实现拖动栏

<template>
  <div>
    <div 
      v-for="(item, index) in list" 
      :key="item.id"
      class="sortable-item"
      draggable="true"
      @dragstart="dragStart(index)"
      @dragover.prevent="dragOver(index)"
      @drop="drop(index)"
    >
      {{ item.name }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' }
      ],
      draggedIndex: null
    };
  },
  methods: {
    dragStart(index) {
      this.draggedIndex = index;
    },
    dragOver(index) {
      if (this.draggedIndex !== index) {
        const draggedItem = this.list[this.draggedIndex];
        this.list.splice(this.draggedIndex, 1);
        this.list.splice(index, 0, draggedItem);
        this.draggedIndex = index;
      }
    },
    drop() {
      this.draggedIndex = null;
    }
  }
};
</script>

<style>
.sortable-item {
  padding: 8px;
  margin: 4px;
  background: #f0f0f0;
  border: 1px solid #ddd;
  cursor: move;
}
</style>

标签: 拖动vue
分享给朋友:

相关文章

vue的实现

vue的实现

Vue 的实现原理 Vue 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是 Vue 实现的主要技术细节。 响应式系统 Vue 的响…

vue实现表白

vue实现表白

Vue 实现表白页面 使用 Vue 可以快速创建一个动态、交互式的表白页面。以下是一个简单的实现方案: 基础结构 创建一个 Vue 项目或单文件组件,包含以下核心部分: <template&…

vue底层实现

vue底层实现

Vue.js 的底层实现原理 Vue.js 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是其关键实现细节: 响应式系统 Vue 2…

vue实现tip

vue实现tip

Vue实现Tooltip的方法 使用Vue实现Tooltip可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML的title属性 在Vue模板中直接使用HTML的title属性是最简单的实…

vue实现导出excel实现流程

vue实现导出excel实现流程

安装依赖库 需要安装 xlsx 和 file-saver 库来处理 Excel 文件的生成和保存。通过 npm 或 yarn 安装: npm install xlsx file-saver # 或…

vue实现桌面widget

vue实现桌面widget

Vue 实现桌面 Widget 的方法 使用 Vue 实现桌面 Widget 通常需要结合 Electron 或 NW.js 等桌面应用框架,以及系统级 API 调用。以下是具体实现方法: 使用 E…