当前位置:首页 > VUE

vue实现拖动div

2026-01-19 01:44:03VUE

实现拖动 div 的基本思路

在 Vue 中实现拖动 div 的功能,可以通过监听鼠标事件(mousedownmousemovemouseup)来动态更新元素的位置。核心逻辑是记录初始点击位置,计算移动偏移量,并更新元素的 transformleft/top 样式。

使用原生事件实现拖动

创建一个可拖动的 div,通过 Vue 的指令或方法绑定事件。

<template>
  <div
    ref="draggable"
    class="draggable"
    @mousedown="startDrag"
    :style="{ transform: `translate(${position.x}px, ${position.y}px)` }"
  >
    拖动我
  </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.drag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    drag(e) {
      if (!this.isDragging) return;
      this.position = {
        x: e.clientX - this.startPos.x,
        y: e.clientY - this.startPos.y,
      };
    },
    stopDrag() {
      this.isDragging = false;
      document.removeEventListener('mousemove', this.drag);
      document.removeEventListener('mouseup', this.stopDrag);
    },
  },
};
</script>

<style>
.draggable {
  width: 100px;
  height: 100px;
  background: #42b983;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: move;
  position: absolute;
}
</style>

使用第三方库实现拖动

如果需要更复杂的功能(如边界限制、拖拽手柄),可以使用第三方库如 vuedraggabledraggable-vue-directive

安装 vuedraggable

npm install vuedraggable

示例代码

<template>
  <draggable v-model="list" @start="dragStart" @end="dragEnd">
    <div v-for="item in list" :key="item.id" class="draggable-item">
      {{ 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: {
    dragStart() {
      console.log('拖动开始');
    },
    dragEnd() {
      console.log('拖动结束');
    },
  },
};
</script>

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

边界限制与优化

如果需要限制拖动范围,可以在 drag 方法中添加边界判断逻辑。

drag(e) {
  if (!this.isDragging) return;
  const maxX = window.innerWidth - this.$refs.draggable.offsetWidth;
  const maxY = window.innerHeight - this.$refs.draggable.offsetHeight;
  this.position = {
    x: Math.min(maxX, Math.max(0, e.clientX - this.startPos.x)),
    y: Math.min(maxY, Math.max(0, e.clientY - this.startPos.y)),
  };
}

触摸事件支持

为了支持移动端触摸事件,可以添加 touchstarttouchmovetouchend 事件。

startDrag(e) {
  const clientX = e.clientX ?? e.touches[0].clientX;
  const clientY = e.clientY ?? e.touches[0].clientY;
  this.isDragging = true;
  this.startPos = {
    x: clientX - this.position.x,
    y: clientY - this.position.y,
  };
  document.addEventListener('mousemove', this.drag);
  document.addEventListener('touchmove', this.drag);
  document.addEventListener('mouseup', this.stopDrag);
  document.addEventListener('touchend', this.stopDrag);
}

性能优化

频繁更新 DOM 可能引发性能问题,可以通过以下方式优化:

  • 使用 transform 代替 left/top,避免重排。
  • 节流 mousemove 事件,减少更新频率。
  • 在拖动结束时移除事件监听,避免内存泄漏。

vue实现拖动div

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

相关文章

vue实现视频开场

vue实现视频开场

使用 Vue 实现视频开场动画 在 Vue 中实现视频开场动画可以通过结合 HTML5 的 <video> 标签和 Vue 的过渡效果或生命周期钩子来完成。以下是具体实现方法: 安装依赖…

拖拽式编程vue实现

拖拽式编程vue实现

拖拽式编程在 Vue 中的实现方法 使用 HTML5 原生拖放 API Vue 可以结合 HTML5 的拖放 API 实现基础拖拽功能。通过 draggable 属性标记可拖拽元素,监听 dragst…

vue实现打字机

vue实现打字机

Vue实现打字机效果 在Vue中实现打字机效果可以通过动态更新文本内容并添加延迟来实现。以下是几种常见的实现方法: 使用setInterval实现 <template> <d…

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debo…

vue无限菜单怎么实现

vue无限菜单怎么实现

实现 Vue 无限菜单的方法 递归组件实现嵌套菜单 使用 Vue 的递归组件特性可以轻松实现无限级嵌套菜单。通过组件调用自身的方式处理嵌套数据。 <template> <ul…

vue实现走势图

vue实现走势图

Vue 实现走势图的方法 使用 ECharts 库 ECharts 是一个强大的数据可视化库,支持多种图表类型,包括走势图(折线图)。在 Vue 项目中可以通过 vue-echarts 封装库或直接使…