当前位置:首页 > VUE

vue实现拖动div

2026-02-19 18:07:11VUE

实现拖动 Div 的基本思路

通过 Vue 的指令或组件封装,结合原生 DOM 事件(mousedownmousemovemouseup)实现拖动功能。核心逻辑是计算鼠标移动的偏移量,动态更新目标元素的定位样式(如 lefttop)。

方法一:使用自定义指令

  1. 创建自定义指令
    在 Vue 中注册一个全局或局部指令,监听目标元素的鼠标事件:

    Vue.directive('drag', {
      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.position = 'absolute'; // 确保元素可定位
        });
    
        document.addEventListener('mousemove', (e) => {
          if (!isDragging) return;
          el.style.left = `${e.clientX - offsetX}px`;
          el.style.top = `${e.clientY - offsetY}px`;
        });
    
        document.addEventListener('mouseup', () => {
          isDragging = false;
        });
      }
    });
  2. 在模板中使用指令
    通过 v-drag 指令绑定到目标元素:

    <template>
      <div v-drag class="draggable-div">拖拽我</div>
    </template>

方法二:封装为可复用组件

  1. 创建拖动组件
    将逻辑封装为组件,通过 props 控制拖动行为:

    export default {
      props: {
        initialPosition: { type: Object, default: () => ({ x: 0, y: 0 }) }
      },
      data() {
        return {
          position: { ...this.initialPosition },
          isDragging: false,
          offset: { x: 0, y: 0 }
        };
      },
      methods: {
        startDrag(e) {
          this.isDragging = true;
          this.offset.x = e.clientX - this.position.x;
          this.offset.y = e.clientY - this.position.y;
        },
        onDrag(e) {
          if (!this.isDragging) return;
          this.position.x = e.clientX - this.offset.x;
          this.position.y = e.clientY - this.offset.y;
        },
        stopDrag() {
          this.isDragging = false;
        }
      },
      mounted() {
        document.addEventListener('mousemove', this.onDrag);
        document.addEventListener('mouseup', this.stopDrag);
      },
      beforeDestroy() {
        document.removeEventListener('mousemove', this.onDrag);
        document.removeEventListener('mouseup', this.stopDrag);
      }
    };
  2. 在模板中使用组件
    通过样式绑定动态更新位置:

    <template>
      <div
        class="draggable-component"
        :style="{ left: `${position.x}px`, top: `${position.y}px` }"
        @mousedown="startDrag"
      >
        拖拽我
      </div>
    </template>

方法三:使用第三方库

  1. 安装 vuedraggable
    适用于列表拖拽排序,但也可调整配置实现自由拖动:

    npm install vuedraggable
  2. 配置自由拖动模式
    通过 draggable 选项和 CSS 调整:

    import draggable from 'vuedraggable';
    export default {
      components: { draggable },
      data() {
        return { list: [{ id: 1, text: '拖拽元素' }] };
      }
    };
    <template>
      <draggable v-model="list" :options="{ group: 'free' }">
        <div v-for="item in list" :key="item.id" class="draggable-item">
          {{ item.text }}
        </div>
      </draggable>
    </template>

注意事项

  • 性能优化
    频繁的 DOM 操作可能影响性能,建议使用 transform 替代 left/top

    .draggable-div {
      transform: translate(0, 0);
    }
  • 边界限制
    添加逻辑限制拖动范围,防止元素超出视口:

    onDrag(e) {
      const maxX = window.innerWidth - el.offsetWidth;
      const maxY = window.innerHeight - el.offsetHeight;
      this.position.x = Math.min(maxX, Math.max(0, e.clientX - this.offset.x));
      this.position.y = Math.min(maxY, Math.max(0, e.clientY - this.offset.y));
    }
  • 移动端支持
    需额外监听 touchstarttouchmovetouchend 事件。

    vue实现拖动div

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

相关文章

vue实现选择本地文件

vue实现选择本地文件

实现文件选择功能 在Vue中实现本地文件选择可以通过HTML原生的<input type="file">元素实现。创建一个基本的文件选择组件: <template> &l…

vue  select实现

vue select实现

Vue Select 实现方法 在 Vue 中实现下拉选择功能可以使用原生 <select> 标签或第三方库如 vue-select。以下是两种方法的详细说明: 原生 HTML Sele…

vue实现单据

vue实现单据

Vue 实现单据功能的方法 使用 Vue 实现单据功能通常涉及表单设计、数据绑定、验证和提交等环节。以下是具体实现方案: 表单设计与数据绑定 使用 Vue 的 v-model 指令实现表单数据的双向…

vue实现长按

vue实现长按

Vue 实现长按功能的方法 在 Vue 中实现长按功能可以通过原生事件监听或自定义指令完成。以下是几种常见实现方式: 使用原生事件监听 通过 @mousedown 和 @mouseup 或 @tou…

vue实现导出

vue实现导出

Vue 实现导出功能的方法 在 Vue 项目中实现导出功能通常涉及将数据导出为 Excel、CSV 或其他格式。以下是几种常见的实现方式: 使用 xlsx 库导出 Excel 安装 xlsx 库:…

vue实现选人

vue实现选人

实现选人功能的基本思路 在Vue中实现选人功能通常涉及以下核心环节:数据绑定、用户交互处理、状态管理以及界面渲染。以下是具体实现方法: 数据准备与组件结构 创建包含人员信息的数组,通常从API获取或…