当前位置:首页 > 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 控制拖动行为:

    vue实现拖动div

    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 调整:

    vue实现拖动div

    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
分享给朋友:

相关文章

vue实现发送值接受值

vue实现发送值接受值

Vue 实现父子组件传值 父组件向子组件传值(props) 父组件通过 v-bind 或简写 : 向子组件传递数据。子组件通过 props 接收数据。 父组件代码: <template&g…

vue element实现

vue element实现

Vue Element UI 实现 Vue Element UI 是基于 Vue.js 的组件库,提供丰富的 UI 组件,适合快速开发企业级中后台产品。以下是一些关键实现方法和步骤: 安装 Vue…

vue评分实现

vue评分实现

Vue 评分组件实现方法 使用第三方库(如 Element UI) 安装 Element UI: npm install element-ui 引入并注册组件: import Vue from…

vue 动画 实现

vue 动画 实现

vue 动画实现方法 Vue 提供了多种方式实现动画效果,主要包括过渡动画和动态动画两类。 使用 <transition> 组件实现基础过渡 通过 Vue 内置的 <transi…

vue实现节流

vue实现节流

vue实现节流的方法 在Vue中实现节流(throttle)功能,通常用于限制高频事件的触发频率,例如滚动、输入或按钮点击。以下是几种常见的实现方式: 使用Lodash的throttle函数 安装L…

vue 实现视频

vue 实现视频

Vue 实现视频播放功能 使用 Vue 实现视频播放功能可以通过 HTML5 的 <video> 标签或第三方库(如 video.js)来实现。以下是两种常见的方法: 使用 HTML5…