当前位置:首页 > 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.js设计与实现》是一本深入解析Vue.js框架原理的书籍,由霍春阳(HcySunYang)撰写。以下是获取该资源的常见途径: 正版购买渠道 京东、…

vue实现看板

vue实现看板

Vue 实现看板功能 使用 Vue 实现看板功能可以通过组件化开发、状态管理和拖拽库结合完成。以下是一个完整的实现方案: 基础项目结构 src/ ├── components/ │ ├── Ka…

vue实现横滚

vue实现横滚

Vue 实现横滚效果 横滚效果通常指水平滚动内容,常见于轮播图、横向导航栏等场景。以下是几种实现方式: 使用 CSS 和 Vue 结合 通过 CSS 的 overflow-x 和 white-spa…

vue实现mvvm

vue实现mvvm

Vue 实现 MVVM 模式 MVVM(Model-View-ViewModel)是一种前端架构模式,Vue 是其典型实现之一。MVVM 的核心是通过数据绑定和响应式系统实现视图与数据的自动同步。…

vue实现循环

vue实现循环

Vue 实现循环的方法 在 Vue 中,可以通过 v-for 指令实现循环渲染列表或对象。以下是几种常见的用法: 遍历数组 使用 v-for 遍历数组时,可以同时获取当前项和索引: <ul&…

vue 实现vshow

vue 实现vshow

Vue 实现 v-show 在 Vue 中,v-show 是一个常用的指令,用于根据条件控制元素的显示或隐藏。与 v-if 不同,v-show 不会移除 DOM 元素,而是通过 CSS 的 displ…