当前位置:首页 > VUE

vue 实现拖动效果

2026-02-18 19:00:24VUE

Vue 实现拖动效果的方法

使用 HTML5 拖放 API

HTML5 提供了原生拖放 API,结合 Vue 的事件绑定可以轻松实现拖动效果。

<template>
  <div 
    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)
    },
    handleDragEnd() {
      // 拖动结束处理
    },
    handleDrop(e) {
      e.preventDefault()
      const data = e.dataTransfer.getData('text/plain')
      // 放置处理逻辑
    }
  }
}
</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() {
      // 拖动结束处理
    }
  }
}
</script>

自定义拖动实现

通过鼠标事件实现更灵活的拖动控制。

<template>
  <div 
    class="draggable-item"
    :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 }
    }
  },
  methods: {
    startDrag(e) {
      this.dragStart = { x: e.clientX, y: e.clientY }
      document.addEventListener('mousemove', this.onDrag)
      document.addEventListener('mouseup', this.stopDrag)
    },
    onDrag(e) {
      this.position.x += e.clientX - this.dragStart.x
      this.position.y += e.clientY - this.dragStart.y
      this.dragStart = { x: e.clientX, y: e.clientY }
    },
    stopDrag() {
      document.removeEventListener('mousemove', this.onDrag)
      document.removeEventListener('mouseup', this.stopDrag)
    }
  }
}
</script>

<style>
.draggable-item {
  position: absolute;
  cursor: move;
}
</style>

使用拖拽指令

创建自定义指令实现可复用拖动功能。

Vue.directive('drag', {
  bind(el) {
    let startX, startY, initialX, initialY

    el.style.position = 'absolute'
    el.style.cursor = 'move'

    el.addEventListener('mousedown', (e) => {
      startX = e.clientX
      startY = e.clientY
      initialX = el.offsetLeft
      initialY = el.offsetTop

      document.addEventListener('mousemove', move)
      document.addEventListener('mouseup', stop)
    })

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

    function stop() {
      document.removeEventListener('mousemove', move)
      document.removeEventListener('mouseup', stop)
    }
  }
})

使用指令:

vue 实现拖动效果

<div v-drag>通过指令实现拖动</div>

标签: 拖动效果
分享给朋友:

相关文章

jquery拖动

jquery拖动

jQuery 拖动实现方法 使用 jQuery 实现拖动功能可以通过原生 HTML5 的拖放 API 或借助 jQuery UI 的拖拽组件。以下是两种常见的方法: 使用 jQuery UI 的 D…

vue实现玻璃效果

vue实现玻璃效果

实现玻璃效果的方法 在Vue中实现玻璃效果(毛玻璃或磨砂玻璃)可以通过CSS的backdrop-filter属性结合Vue的动态样式绑定来实现。以下是具体步骤: 使用CSS backdrop-fil…

vue实现过渡效果

vue实现过渡效果

Vue 过渡效果实现方法 Vue 提供了内置的 <transition> 和 <transition-group> 组件,用于在元素或组件进入/离开 DOM 时应用过渡效果。以…

vue 实现过渡效果

vue 实现过渡效果

Vue 过渡效果实现方法 Vue 提供了 <transition> 和 <transition-group> 组件,用于在元素插入、更新或移除时应用动画效果。以下是具体实现方式…

vue实现删除效果

vue实现删除效果

Vue实现删除效果的方法 使用v-if或v-show控制显示 通过数据绑定和条件渲染指令,可以动态控制元素的显示与隐藏。v-if会完全移除DOM元素,v-show仅通过CSS控制显示。 <te…

vue实现移动效果

vue实现移动效果

使用 CSS 过渡实现移动效果 在 Vue 中,可以通过 v-bind:class 或 v-bind:style 结合 CSS 过渡实现移动效果。定义一个 CSS 类,包含 transition 属性…