当前位置:首页 > VUE

vue实现div拖拽

2026-01-16 04:29:19VUE

Vue 实现 Div 拖拽的方法

使用原生 HTML5 拖拽 API

在 Vue 中可以通过 HTML5 的拖拽 API 实现基础拖拽功能。需要为元素添加 draggable 属性,并监听 dragstartdragend 等事件。

<template>
  <div 
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
    class="draggable-div"
  >
    拖拽我
  </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'
    }
  }
}
</script>

使用 Vue.Draggable 库

Vue.Draggable 是基于 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>

自定义拖拽实现

通过鼠标事件实现更灵活的拖拽控制,适合需要自定义拖拽行为的场景。

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

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

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

拖拽边界限制

为自定义拖拽添加边界限制,防止元素被拖出可视区域。

onDrag(e) {
  if (!this.isDragging) return

  const newX = e.clientX - this.dragStart.x
  const newY = e.clientY - this.dragStart.y

  // 限制在窗口范围内
  const maxX = window.innerWidth - this.$el.offsetWidth
  const maxY = window.innerHeight - this.$el.offsetHeight

  this.position.x = Math.max(0, Math.min(newX, maxX))
  this.position.y = Math.max(0, Math.min(newY, maxY))
}

拖拽放置区域

实现拖拽元素与放置区域的交互,需要监听 dragoverdrop 事件。

vue实现div拖拽

<template>
  <div 
    class="dropzone"
    @dragover.prevent
    @drop="handleDrop"
  >
    放置区域
  </div>
</template>

<script>
export default {
  methods: {
    handleDrop(e) {
      e.preventDefault()
      const data = e.dataTransfer.getData('text/plain')
      console.log('接收拖拽数据:', data)
    }
  }
}
</script>

<style>
.dropzone {
  width: 300px;
  height: 200px;
  border: 2px dashed #ccc;
}
</style>

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

相关文章

vue 实现tabs

vue 实现tabs

Vue 实现 Tabs 组件的方法 使用动态组件和 v-for 在 Vue 中实现 Tabs 可以通过动态组件和 v-for 指令结合完成。定义一个 tabs 数组,包含每个标签的标题和对应的组件。…

vue实现过滤

vue实现过滤

Vue实现过滤的方法 在Vue中实现数据过滤可以通过多种方式完成,以下是几种常见的方法: 使用计算属性过滤 计算属性是Vue中处理数据过滤的理想选择,它们基于响应式依赖进行缓存,只有在相关依赖发生改…

vue环境实现

vue环境实现

Vue 环境搭建 安装 Node.js 和 npm Node.js 是运行 Vue 的基础环境,npm 是包管理工具。从 Node.js 官网 下载并安装最新稳定版本。安装完成后,在终端运行以下命令验…

vue 实现弹窗

vue 实现弹窗

Vue 实现弹窗的方法 在 Vue 中实现弹窗功能可以通过多种方式完成,以下是几种常见的方法: 使用组件和 v-if/v-show 控制显示 创建一个独立的弹窗组件,通过 v-if 或 v-show…

vue 实现折叠

vue 实现折叠

Vue 实现折叠功能的方法 在 Vue 中实现折叠功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-if 或 v-show 控制显示隐藏 通过绑定一个布尔值变量,结合 v-if 或 v…

vue实现uuid

vue实现uuid

使用 uuid 库生成 UUID 在 Vue 项目中,可以使用 uuid 库来生成 UUID。安装依赖: npm install uuid 在 Vue 组件中使用: import { v4 as…