当前位置:首页 > VUE

vue实现拖拽效果代码

2026-02-25 06:43:48VUE

Vue 实现拖拽效果

使用 HTML5 原生拖拽 API

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

<template>
  <div>
    <div
      v-for="item in items"
      :key="item.id"
      draggable="true"
      @dragstart="handleDragStart($event, item)"
      @dragover.prevent
      @drop="handleDrop($event, item)"
      class="draggable-item"
    >
      {{ item.text }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, text: "Item 1" },
        { id: 2, text: "Item 2" },
        { id: 3, text: "Item 3" },
      ],
      draggedItem: null,
    };
  },
  methods: {
    handleDragStart(event, item) {
      this.draggedItem = item;
      event.dataTransfer.setData("text/plain", item.id);
    },
    handleDrop(event, targetItem) {
      if (this.draggedItem.id === targetItem.id) return;
      const draggedIndex = this.items.findIndex(
        (item) => item.id === this.draggedItem.id
      );
      const targetIndex = this.items.findIndex(
        (item) => item.id === targetItem.id
      );
      const newItems = [...this.items];
      newItems.splice(draggedIndex, 1);
      newItems.splice(targetIndex, 0, this.draggedItem);
      this.items = newItems;
    },
  },
};
</script>

<style>
.draggable-item {
  padding: 10px;
  margin: 5px;
  background: #f0f0f0;
  cursor: move;
}
</style>

使用第三方库 Vue.Draggable

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

安装 Vue.Draggable:

npm install vuedraggable

示例代码:

<template>
  <div>
    <draggable v-model="items" group="items" @end="onDragEnd">
      <div v-for="item in items" :key="item.id" class="draggable-item">
        {{ item.text }}
      </div>
    </draggable>
  </div>
</template>

<script>
import draggable from "vuedraggable";

export default {
  components: {
    draggable,
  },
  data() {
    return {
      items: [
        { id: 1, text: "Item 1" },
        { id: 2, text: "Item 2" },
        { id: 3, text: "Item 3" },
      ],
    };
  },
  methods: {
    onDragEnd() {
      console.log("Drag ended", this.items);
    },
  },
};
</script>

<style>
.draggable-item {
  padding: 10px;
  margin: 5px;
  background: #f0f0f0;
  cursor: move;
}
</style>

使用自定义拖拽逻辑

如果需要更灵活的拖拽逻辑,可以通过鼠标事件实现自定义拖拽效果。

vue实现拖拽效果代码

<template>
  <div>
    <div
      v-for="item in items"
      :key="item.id"
      @mousedown="startDrag($event, item)"
      @mousemove="onDrag"
      @mouseup="stopDrag"
      :style="{
        position: 'absolute',
        left: item.x + 'px',
        top: item.y + 'px',
      }"
      class="draggable-item"
    >
      {{ item.text }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, text: "Item 1", x: 0, y: 0 },
        { id: 2, text: "Item 2", x: 100, y: 0 },
        { id: 3, text: "Item 3", x: 200, y: 0 },
      ],
      isDragging: false,
      currentItem: null,
      startX: 0,
      startY: 0,
    };
  },
  methods: {
    startDrag(event, item) {
      this.isDragging = true;
      this.currentItem = item;
      this.startX = event.clientX - item.x;
      this.startY = event.clientY - item.y;
    },
    onDrag(event) {
      if (!this.isDragging) return;
      this.currentItem.x = event.clientX - this.startX;
      this.currentItem.y = event.clientY - this.startY;
    },
    stopDrag() {
      this.isDragging = false;
      this.currentItem = null;
    },
  },
};
</script>

<style>
.draggable-item {
  padding: 10px;
  background: #f0f0f0;
  cursor: move;
  user-select: none;
}
</style>

注意事项

  • 使用 HTML5 原生拖拽 API 时,需要确保 @dragover.prevent 阻止默认行为,否则拖拽可能无效。
  • Vue.Draggable 提供了更丰富的功能,如分组拖拽、动画效果等,适合复杂场景。
  • 自定义拖拽逻辑适合需要高度定制化的拖拽行为,但实现复杂度较高。

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

相关文章

vue实现预览效果

vue实现预览效果

Vue 实现预览效果的方法 使用 v-html 指令实现简单预览 在 Vue 中可以通过 v-html 指令直接将 HTML 字符串渲染到页面上,适用于简单的富文本预览场景。 <templat…

vue实现突出效果

vue实现突出效果

Vue 实现突出效果的方法 在 Vue 中实现突出效果通常涉及动态样式绑定、动画过渡或第三方库的使用。以下是几种常见实现方式: 动态类名绑定 通过 v-bind:class 或简写 :class 实…

vue 拖拽排序 实现

vue 拖拽排序 实现

实现拖拽排序的基本思路 在Vue中实现拖拽排序通常需要借助HTML5的拖放API或第三方库如sortablejs、vuedraggable等。以下是两种常见实现方式: 使用HTML5原生拖放API…

js实现图片拖拽

js实现图片拖拽

实现图片拖拽的基本步骤 HTML 结构需要包含可拖拽的图片元素,并设置 draggable 属性为 true: <img id="dragImage" src="image.jpg" drag…

vue实现抽屉效果

vue实现抽屉效果

Vue 实现抽屉效果的方法 使用 Vue 过渡动画和 CSS 在 Vue 中可以通过 v-if 或 v-show 控制抽屉的显示隐藏,结合 <transition> 组件实现平滑动画效果。…

vue 实现拖拽功能

vue 实现拖拽功能

Vue 实现拖拽功能的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…