当前位置:首页 > 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)
    }
  }
})

使用指令:

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

vue 实现拖动效果

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

相关文章

css3制作立体效果

css3制作立体效果

使用 transform 属性实现立体旋转 通过 transform-style: preserve-3d 和 rotateX/Y/Z 实现 3D 空间变换: .container { tr…

jquery 效果

jquery 效果

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。jQuery 提供了丰富的效果(Effects)功能,可以轻松实现元素的动态显…

vue实现气泡效果

vue实现气泡效果

实现气泡效果的方法 在Vue中实现气泡效果可以通过CSS动画、第三方库或自定义组件完成。以下是几种常见方法: 使用纯CSS动画 通过CSS的@keyframes和transform属性创建气泡上升动…

vue实现效果更新

vue实现效果更新

Vue 实现效果更新的方法 Vue 提供了多种方式实现动态效果更新,主要依赖其响应式系统和生命周期钩子。以下是几种常见的方法: 数据绑定与响应式更新 Vue 的核心是数据驱动视图。通过修改数据,视…

vue实现旋转效果

vue实现旋转效果

使用CSS动画实现旋转 在Vue中可以通过CSS的@keyframes或transform属性实现旋转效果。在组件的<style>部分定义旋转动画: .rotate { animat…

vue实现滑动效果

vue实现滑动效果

Vue 实现滑动效果的方法 在 Vue 中实现滑动效果可以通过多种方式,包括使用 CSS 过渡、第三方动画库或直接操作 DOM。以下是几种常见的方法: 使用 CSS 过渡和 Vue 的 <t…