当前位置:首页 > VUE

vue 实现div拖拽

2026-03-10 00:40:17VUE

Vue 实现 Div 拖拽的方法

使用原生 HTML5 拖拽 API

HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。

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

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

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,提供了更高级的拖拽功能。

vue 实现div拖拽

安装 Vue.Draggable:

npm install vuedraggable

示例代码:

vue 实现div拖拽

<template>
  <draggable v-model="list" @end="onEnd">
    <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' },
        { id: 3, name: 'Item 3' }
      ]
    };
  },
  methods: {
    onEnd() {
      console.log('拖拽结束');
    }
  }
};
</script>

自定义拖拽实现

通过监听鼠标事件实现自定义拖拽逻辑。

<template>
  <div
    class="draggable"
    @mousedown="startDrag"
    @mousemove="onDrag"
    @mouseup="stopDrag"
    :style="dragStyle"
  >
    拖拽我
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDragging: false,
      startX: 0,
      startY: 0,
      offsetX: 0,
      offsetY: 0
    };
  },
  computed: {
    dragStyle() {
      return {
        transform: `translate(${this.offsetX}px, ${this.offsetY}px)`
      };
    }
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startX = e.clientX;
      this.startY = e.clientY;
    },
    onDrag(e) {
      if (this.isDragging) {
        this.offsetX = e.clientX - this.startX;
        this.offsetY = e.clientY - this.startY;
      }
    },
    stopDrag() {
      this.isDragging = false;
    }
  }
};
</script>

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

拖拽边界限制

在自定义拖拽实现中,可以添加边界限制防止元素拖出可视区域。

onDrag(e) {
  if (this.isDragging) {
    const newX = e.clientX - this.startX;
    const newY = e.clientY - this.startY;

    const maxX = window.innerWidth - 100;
    const maxY = window.innerHeight - 100;

    this.offsetX = Math.max(0, Math.min(newX, maxX));
    this.offsetY = Math.max(0, Math.min(newY, maxY));
  }
}

以上方法提供了不同复杂度的拖拽实现方案,可以根据项目需求选择合适的方式。原生 API 适合简单场景,Vue.Draggable 适合列表排序,自定义实现则提供最大的灵活性。

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

相关文章

vue实现选区

vue实现选区

Vue 实现选区的基本方法 在Vue中实现选区功能通常涉及DOM操作和事件处理。以下是几种常见的方法: 使用原生JavaScript的Selection API 通过window.getSelec…

vue搜索实现

vue搜索实现

Vue 搜索功能实现方法 基于计算属性的搜索 在 Vue 中可以通过计算属性实现简单的搜索功能。这种方式适合小型数据集,利用 JavaScript 的 filter 方法进行筛选。 data() {…

vue实现 hover

vue实现 hover

实现 Vue 中的 hover 效果 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是常见的几种方法: 使用 CSS 伪类 最简单的方式是直接使用 CSS 的 :hover 伪类,无…

vue实现画板

vue实现画板

Vue 实现画板功能 在 Vue 中实现画板功能可以通过 HTML5 的 Canvas API 实现。以下是一个完整的实现方案: 创建 Vue 组件 新建一个 Vue 单文件组件(SFC),命名为…

vue嵌套grafana实现

vue嵌套grafana实现

Vue 中嵌套 Grafana 的实现方法 使用 iframe 嵌入 Grafana 面板 在 Vue 项目中可以通过 iframe 直接嵌入 Grafana 的面板或仪表板。确保 Grafana 已…

vue点击实现动画

vue点击实现动画

Vue 中实现点击动画的方法 使用 Vue 过渡(Transition)组件 Vue 提供了内置的 <transition> 组件,可以轻松实现元素进入/离开的动画效果。结合 v-if 或…