当前位置:首页 > VUE

vue实现元素拖拽

2026-01-17 16:37:00VUE

Vue 实现元素拖拽的方法

使用 HTML5 原生拖拽 API

HTML5 提供了原生拖拽 API,可以通过 draggable 属性结合事件监听实现拖拽功能。

<template>
  <div 
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
    @dragover="handleDragOver"
    @drop="handleDrop"
  >
    拖拽元素
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id);
    },
    handleDragOver(e) {
      e.preventDefault();
    },
    handleDrop(e) {
      e.preventDefault();
      const data = e.dataTransfer.getData('text/plain');
      const draggedElement = document.getElementById(data);
      e.target.appendChild(draggedElement);
    },
    handleDragEnd() {
      // 拖拽结束后的处理
    }
  }
};
</script>

使用第三方库 vue-draggable

vue-draggable 是基于 Sortable.js 的 Vue 拖拽组件,适用于列表拖拽排序等场景。

vue实现元素拖拽

安装依赖:

npm install vuedraggable

使用示例:

vue实现元素拖拽

<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>

自定义拖拽指令

通过 Vue 自定义指令实现更灵活的拖拽逻辑。

<template>
  <div v-drag>可拖拽元素</div>
</template>

<script>
export default {
  directives: {
    drag: {
      bind(el) {
        let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
        el.onmousedown = dragMouseDown;

        function dragMouseDown(e) {
          e.preventDefault();
          pos3 = e.clientX;
          pos4 = e.clientY;
          document.onmouseup = closeDragElement;
          document.onmousemove = elementDrag;
        }

        function elementDrag(e) {
          e.preventDefault();
          pos1 = pos3 - e.clientX;
          pos2 = pos4 - e.clientY;
          pos3 = e.clientX;
          pos4 = e.clientY;
          el.style.top = (el.offsetTop - pos2) + 'px';
          el.style.left = (el.offsetLeft - pos1) + 'px';
        }

        function closeDragElement() {
          document.onmouseup = null;
          document.onmousemove = null;
        }
      }
    }
  }
};
</script>

<style>
div {
  position: absolute;
  cursor: move;
}
</style>

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

通过计算边界限制拖拽范围。

<template>
  <div 
    class="draggable" 
    @mousedown="startDrag" 
    :style="{ left: position.x + 'px', top: position.y + 'px' }"
  >
    限制区域拖拽
  </div>
</template>

<script>
export default {
  data() {
    return {
      position: { x: 0, y: 0 },
      isDragging: false
    };
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      const startX = e.clientX - this.position.x;
      const startY = e.clientY - this.position.y;

      document.onmousemove = (e) => {
        if (!this.isDragging) return;
        let x = e.clientX - startX;
        let y = e.clientY - startY;

        // 限制在父容器内
        const parentRect = this.$el.parentElement.getBoundingClientRect();
        const elRect = this.$el.getBoundingClientRect();
        x = Math.max(0, Math.min(x, parentRect.width - elRect.width));
        y = Math.max(0, Math.min(y, parentRect.height - elRect.height));

        this.position = { x, y };
      };

      document.onmouseup = () => {
        this.isDragging = false;
        document.onmousemove = null;
        document.onmouseup = null;
      };
    }
  }
};
</script>

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

注意事项

  • 移动端适配需额外处理 touch 事件
  • 复杂场景建议使用成熟的第三方库(如 interact.js
  • 性能敏感场景注意减少 DOM 操作
  • 拖拽状态管理可通过 Vuex 或事件总线实现跨组件通信

标签: 拖拽元素
分享给朋友:

相关文章

vue实现拖拽div

vue实现拖拽div

Vue 实现拖拽 Div 的方法 使用原生 HTML5 拖拽 API HTML5 提供了原生的拖拽 API,结合 Vue 的事件绑定可以快速实现拖拽功能。以下是实现步骤: <template&…

vue实现拖拽

vue实现拖拽

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

vue 实现拖拽甘特图

vue 实现拖拽甘特图

实现拖拽甘特图的核心思路 Vue 实现拖拽甘特图需要结合第三方库或自定义逻辑,核心功能包括任务条渲染、时间轴刻度、拖拽交互、数据绑定等。以下是具体实现方法: 使用第三方库(推荐) vue-gantt…

jquery删除元素

jquery删除元素

使用 jQuery 删除元素的方法 删除元素及其子元素 remove() 方法可以删除选中的元素及其所有子元素。 示例代码: $("#elementId").remove(); 仅删除元素内容…

vue 实现拖拽插件

vue 实现拖拽插件

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

vue怎么实现拖拽

vue怎么实现拖拽

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