当前位置:首页 > VUE

vue实现组件可拖拽

2026-02-22 10:33:44VUE

Vue实现组件拖拽的方法

使用HTML5原生拖拽API

HTML5提供了原生的拖拽API,可以通过draggable属性、dragstartdragenddragoverdrop事件实现基础拖拽功能。

<template>
  <div 
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
    class="draggable-item">
    拖拽我
  </div>
  <div 
    @dragover.prevent
    @drop="handleDrop"
    class="drop-zone">
    放置区域
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id)
    },
    handleDrop(e) {
      const id = e.dataTransfer.getData('text/plain')
      const draggableElement = document.getElementById(id)
      e.target.appendChild(draggableElement)
    }
  }
}
</script>

使用第三方库vue-draggable

vue-draggable是基于Sortable.js的Vue组件,提供了更完善的拖拽功能,支持列表排序、跨列表拖拽等场景。

安装依赖:

npm install vuedraggable

基本用法:

<template>
  <draggable v-model="myArray" group="people" @start="drag=true" @end="drag=false">
    <div v-for="element in myArray" :key="element.id">
      {{ element.name }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable'

export default {
  components: { draggable },
  data() {
    return {
      myArray: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' }
      ]
    }
  }
}
</script>

自定义拖拽指令

可以通过Vue自定义指令实现更灵活的拖拽控制,适合需要高度定制化的场景。

Vue.directive('drag', {
  bind(el, binding) {
    el.style.position = 'absolute'
    let startX, startY, initialX, initialY

    el.addEventListener('mousedown', startDrag)

    function startDrag(e) {
      startX = e.clientX
      startY = e.clientY
      initialX = el.offsetLeft
      initialY = el.offsetTop

      document.addEventListener('mousemove', drag)
      document.addEventListener('mouseup', stopDrag)
      e.preventDefault()
    }

    function drag(e) {
      const dx = e.clientX - startX
      const dy = e.clientY - startY
      el.style.left = initialX + dx + 'px'
      el.style.top = initialY + dy + 'px'
    }

    function stopDrag() {
      document.removeEventListener('mousemove', drag)
      document.removeEventListener('mouseup', stopDrag)
    }
  }
})

使用拖拽事件实现限制区域

可以通过计算鼠标位置和元素边界,实现只能在特定区域内拖拽的效果。

methods: {
  handleDrag(e) {
    const container = this.$refs.container
    const item = this.$refs.draggable
    const containerRect = container.getBoundingClientRect()
    const itemRect = item.getBoundingClientRect()

    let left = e.clientX - containerRect.left - itemRect.width/2
    let top = e.clientY - containerRect.top - itemRect.height/2

    // 限制在容器范围内
    left = Math.max(0, Math.min(left, containerRect.width - itemRect.width))
    top = Math.max(0, Math.min(top, containerRect.height - itemRect.height))

    item.style.left = left + 'px'
    item.style.top = top + 'px'
  }
}

触摸设备支持

为了在移动设备上支持拖拽,需要添加触摸事件处理。

vue实现组件可拖拽

el.addEventListener('touchstart', handleTouchStart)
el.addEventListener('touchmove', handleTouchMove)

function handleTouchStart(e) {
  const touch = e.touches[0]
  startX = touch.clientX
  startY = touch.clientY
}

function handleTouchMove(e) {
  const touch = e.touches[0]
  const dx = touch.clientX - startX
  const dy = touch.clientY - startY
  el.style.transform = `translate(${dx}px, ${dy}px)`
}

每种方法适用于不同场景,HTML5原生API适合简单拖拽,vue-draggable适合列表排序,自定义指令和限制区域适合游戏或特殊交互需求。

标签: 组件拖拽
分享给朋友:

相关文章

vue实现拖拽

vue实现拖拽

Vue 实现拖拽功能的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。在 Vue 中可以通过绑定这些事件来实现…

elementui组件

elementui组件

ElementUI 组件概述 ElementUI 是一套基于 Vue.js 的桌面端组件库,提供丰富的 UI 组件,适用于快速开发中后台系统。以下是其核心组件分类及典型用法。 基础组件 Button…

vue实现拖拽实现布局

vue实现拖拽实现布局

Vue 实现拖拽布局的方法 使用 Vue.Draggable 库 Vue.Draggable 是基于 Sortable.js 的 Vue 组件,适合实现列表或网格的拖拽排序。 安装依赖: npm…

vue实现拖拽连接

vue实现拖拽连接

Vue 实现拖拽连接功能 在 Vue 中实现拖拽连接功能通常涉及使用 HTML5 的拖放 API 或第三方库(如 vuedraggable)。以下是两种常见实现方式: 使用 HTML5 拖放 API…

uniapp 滑动组件

uniapp 滑动组件

uniapp 滑动组件实现方法 使用swiper组件 uniapp内置的swiper组件可以实现滑动效果,适用于轮播图或页面切换场景。 示例代码: <swiper :indicator-d…

vue实现父子组件

vue实现父子组件

Vue 父子组件通信实现方式 1. 父组件向子组件传递数据(Props) 父组件通过 props 向子组件传递数据,子组件通过 props 接收数据。 父组件模板: <template>…