当前位置:首页 > VUE

vue实现拖拽框

2026-02-20 01:15:26VUE

实现拖拽框的基本思路

在Vue中实现拖拽功能,可以利用HTML5的拖放API或第三方库如vuedraggable。以下是两种常见方法的实现方式。

使用HTML5拖放API

HTML5原生提供了拖放API,通过draggable属性和相关事件实现拖拽功能。

<template>
  <div 
    class="draggable-box" 
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
    @dragover.prevent
    @drop="handleDrop"
  >
    拖拽我
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id);
      e.target.style.opacity = '0.4';
    },
    handleDragEnd(e) {
      e.target.style.opacity = '1';
    },
    handleDrop(e) {
      e.preventDefault();
      const data = e.dataTransfer.getData('text/plain');
      e.target.appendChild(document.getElementById(data));
    }
  }
};
</script>

<style>
.draggable-box {
  width: 100px;
  height: 100px;
  background-color: #42b983;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: move;
}
</style>

使用vuedraggable库

vuedraggable是一个基于Sortable.js的Vue拖拽组件,适合列表拖拽或复杂场景。

安装依赖:

npm install vuedraggable

示例代码:

<template>
  <draggable 
    v-model="list" 
    @start="dragStart" 
    @end="dragEnd"
  >
    <div v-for="item in list" :key="item.id" class="draggable-item">
      {{ 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' },
        { id: 3, name: 'Item 3' }
      ]
    };
  },
  methods: {
    dragStart() {
      console.log('拖拽开始');
    },
    dragEnd() {
      console.log('拖拽结束');
    }
  }
};
</script>

<style>
.draggable-item {
  padding: 10px;
  margin: 5px;
  background-color: #f0f0f0;
  cursor: move;
}
</style>

实现边界限制

如果需要限制拖拽范围,可以通过计算位置并动态调整元素样式。

vue实现拖拽框

<template>
  <div 
    class="draggable-container" 
    @mousedown="startDrag" 
    @mousemove="onDrag" 
    @mouseup="stopDrag"
    :style="{ left: position.x + 'px', top: position.y + 'px' }"
  >
    拖拽我(限制边界)
  </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
      };
    },
    onDrag(e) {
      if (!this.isDragging) return;
      const maxX = window.innerWidth - 100;
      const maxY = window.innerHeight - 100;
      this.position.x = Math.min(Math.max(0, e.clientX - this.startPos.x), maxX);
      this.position.y = Math.min(Math.max(0, e.clientY - this.startPos.y), maxY);
    },
    stopDrag() {
      this.isDragging = false;
    }
  }
};
</script>

<style>
.draggable-container {
  position: absolute;
  width: 100px;
  height: 100px;
  background-color: #ff7f50;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: move;
}
</style>

注意事项

  • 使用原生拖放API时,需注意浏览器兼容性(如IE需额外处理)。
  • vuedraggable适用于列表排序,若需自由拖拽可结合鼠标事件实现。
  • 移动端需额外处理触摸事件(如touchstarttouchmove)。

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

相关文章

vue登录逻辑的实现

vue登录逻辑的实现

Vue 登录逻辑实现 前端实现 创建登录组件 在 Vue 项目中创建一个登录组件,通常命名为 Login.vue。该组件包含表单元素,如用户名和密码输入框,以及提交按钮。 <template&…

vue实现slidetoggle

vue实现slidetoggle

Vue 实现 SlideToggle 效果 SlideToggle 是一种常见的交互效果,元素以滑动方式展开或收起。以下是几种实现方法: 使用 CSS Transition 和 v-show 通过…

vue 实现报价

vue 实现报价

Vue 实现报价功能 在 Vue 中实现报价功能通常涉及前端表单交互、数据计算和与后端 API 的通信。以下是实现报价功能的几种常见方法: 表单设计与数据绑定 使用 Vue 的 v-model 指…

mui实现vue

mui实现vue

mui 实现 Vue 的步骤 mui 是一个轻量级的前端框架,常用于移动端开发。结合 Vue 可以实现高效的开发体验。以下是具体实现方法。 安装 mui 和 Vue 通过 npm 或 yarn 安装…

vue实现项目

vue实现项目

Vue 项目实现指南 环境准备 确保已安装 Node.js(建议版本 14+)和 npm/yarn。通过以下命令检查版本: node -v npm -v 创建 Vue 项目 使用 Vue CLI 快…

前端vue实现概率

前端vue实现概率

Vue实现概率功能的方法 在Vue中实现概率功能通常涉及随机数生成和概率计算。以下是几种常见实现方式: 基础概率实现 使用Math.random()生成0到1之间的随机数,与设定概率比较:…