当前位置:首页 > VUE

vue拖拽实现方式

2026-01-08 06:38:46VUE

Vue拖拽实现方式

使用HTML5原生拖拽API

HTML5提供了原生的拖拽API,可以通过draggable属性、dragstartdragenddragoverdrop等事件实现基础拖拽功能。

<template>
  <div 
    draggable="true" 
    @dragstart="handleDragStart"
    @dragover.prevent
    @drop="handleDrop"
  >
    拖拽元素
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id);
    },
    handleDrop(e) {
      const id = e.dataTransfer.getData('text/plain');
      const draggedElement = document.getElementById(id);
      e.target.appendChild(draggedElement);
    }
  }
};
</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() {
      console.log('拖拽结束后的列表顺序:', this.list);
    }
  }
};
</script>

自定义拖拽实现

通过鼠标事件(mousedownmousemovemouseup)可以实现更灵活的拖拽逻辑。

<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 },
      isDragging: false,
      startPos: { x: 0, y: 0 }
    };
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startPos = { x: e.clientX - this.position.x, y: e.clientY - this.position.y };
      document.addEventListener('mousemove', this.onDrag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    onDrag(e) {
      if (this.isDragging) {
        this.position.x = e.clientX - this.startPos.x;
        this.position.y = e.clientY - this.startPos.y;
      }
    },
    stopDrag() {
      this.isDragging = false;
      document.removeEventListener('mousemove', this.onDrag);
      document.removeEventListener('mouseup', this.stopDrag);
    }
  }
};
</script>

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

使用Vue指令实现拖拽

通过自定义指令可以封装拖拽逻辑,实现复用。

<template>
  <div v-draggable class="draggable-box">
    指令实现的拖拽元素
  </div>
</template>

<script>
export default {
  directives: {
    draggable: {
      bind(el) {
        let isDragging = false;
        let offsetX, offsetY;

        el.addEventListener('mousedown', (e) => {
          isDragging = true;
          offsetX = e.clientX - el.getBoundingClientRect().left;
          offsetY = e.clientY - el.getBoundingClientRect().top;
          el.style.cursor = 'grabbing';
        });

        document.addEventListener('mousemove', (e) => {
          if (!isDragging) return;
          el.style.left = `${e.clientX - offsetX}px`;
          el.style.top = `${e.clientY - offsetY}px`;
          el.style.position = 'absolute';
        });

        document.addEventListener('mouseup', () => {
          isDragging = false;
          el.style.cursor = 'grab';
        });
      }
    }
  }
};
</script>

跨框架拖拽方案

对于需要与React或其他框架交互的场景,可以使用第三方库如interact.jsdnd-kit,它们提供更通用的拖拽解决方案。

<template>
  <div ref="draggableRef" class="interact-draggable">
    Interact.js实现的拖拽
  </div>
</template>

<script>
import interact from 'interactjs';
export default {
  mounted() {
    interact(this.$refs.draggableRef).draggable({
      listeners: {
        move: (event) => {
          const target = event.target;
          const x = (parseFloat(target.style.left) || 0) + event.dx;
          const y = (parseFloat(target.style.top) || 0) + event.dy;
          target.style.left = `${x}px`;
          target.style.top = `${y}px`;
        }
      }
    });
  }
};
</script>

vue拖拽实现方式

标签: 拖拽方式
分享给朋友:

相关文章

vue实现拖拽改变尺寸

vue实现拖拽改变尺寸

Vue 实现拖拽改变尺寸的方法 使用原生 HTML5 拖拽 API 通过监听 mousedown、mousemove 和 mouseup 事件实现拖拽调整尺寸。创建一个可拖拽的元素,计算鼠标移动距离并…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document…

h5实现方式

h5实现方式

H5实现方式 H5(HTML5)是构建现代网页和移动应用的核心技术之一,以下为常见的H5实现方式及相关技术要点: 基础HTML5结构 使用HTML5的语义化标签构建页面框架: <!DOC…

h5直播平台实现方式

h5直播平台实现方式

技术选型 H5直播平台的核心技术通常基于WebRTC或HLS协议。WebRTC适合低延迟互动场景,HLS更适合跨平台兼容性。前端可采用video.js或hls.js播放库,后端需要流媒体服务器如Ngi…

拖拽实现vue

拖拽实现vue

实现拖拽功能的基本思路 在Vue中实现拖拽功能可以通过HTML5的Drag and Drop API或第三方库如vuedraggable来完成。以下是两种常见方法的详细说明。 使用HTML5 Dra…