当前位置:首页 > VUE

vue指令实现拖拽

2026-02-20 14:02:42VUE

Vue 指令实现拖拽功能

在 Vue 中可以通过自定义指令实现拖拽功能,以下是两种常见的方法:

方法一:基础拖拽指令

注册一个全局指令或在组件中定义局部指令:

vue指令实现拖拽

Vue.directive('drag', {
  bind(el, binding) {
    el.style.position = 'absolute';
    let startX, startY, initialX, initialY;

    el.addEventListener('mousedown', (e) => {
      startX = e.clientX;
      startY = e.clientY;
      initialX = el.offsetLeft;
      initialY = el.offsetTop;
      document.addEventListener('mousemove', moveElement);
      document.addEventListener('mouseup', stopDrag);
      e.preventDefault();
    });

    function moveElement(e) {
      const dx = e.clientX - startX;
      const dy = e.clientY - startY;
      el.style.left = `${initialX + dx}px`;
      el.style.top = `${initialY + dy}px`;
    }

    function stopDrag() {
      document.removeEventListener('mousemove', moveElement);
      document.removeEventListener('mouseup', stopDrag);
    }
  }
});

使用方式:

<div v-drag style="width: 100px; height: 100px; background: red;"></div>

方法二:支持边界限制的拖拽

vue指令实现拖拽

Vue.directive('drag', {
  bind(el, binding) {
    el.style.position = 'absolute';
    let startX, startY, initialX, initialY;
    const parent = el.parentElement;

    el.addEventListener('mousedown', (e) => {
      startX = e.clientX;
      startY = e.clientY;
      initialX = el.offsetLeft;
      initialY = el.offsetTop;
      document.addEventListener('mousemove', moveElement);
      document.addEventListener('mouseup', stopDrag);
      e.preventDefault();
    });

    function moveElement(e) {
      const dx = e.clientX - startX;
      const dy = e.clientY - startY;
      let newX = initialX + dx;
      let newY = initialY + dy;

      // 边界检查
      if (parent) {
        newX = Math.max(0, Math.min(newX, parent.clientWidth - el.offsetWidth));
        newY = Math.max(0, Math.min(newY, parent.clientHeight - el.offsetHeight));
      }

      el.style.left = `${newX}px`;
      el.style.top = `${newY}px`;
    }

    function stopDrag() {
      document.removeEventListener('mousemove', moveElement);
      document.removeEventListener('mouseup', stopDrag);
    }
  }
});

方法三:支持拖拽数据传递

Vue.directive('drag', {
  bind(el, binding) {
    el.draggable = true;

    el.addEventListener('dragstart', (e) => {
      e.dataTransfer.setData('text/plain', binding.value);
    });
  }
});

// 在目标元素上使用 @drop 和 @dragover.prevent

注意事项

  • 确保拖拽元素设置了 position: absoluteposition: relative
  • 考虑添加 user-select: none 防止文本选中干扰拖拽
  • 移动端需要添加 touch 事件支持
  • 复杂场景建议使用现成的拖拽库如 vue-draggable

标签: 指令拖拽
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

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

vue拖拽实现方式

vue拖拽实现方式

Vue 拖拽实现方式 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件(如 dragstart、dragend、dragover、…

vue 实现拖拽甘特图

vue 实现拖拽甘特图

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

vue 实现全局指令

vue 实现全局指令

注册全局指令 在 Vue 中,可以通过 Vue.directive 方法注册全局指令。全局指令可以在任何组件中使用,无需单独引入。 import Vue from 'vue'; Vue.direc…

vue实现拖拽连线

vue实现拖拽连线

Vue 实现拖拽连线的方法 使用第三方库(推荐) 对于快速实现拖拽连线功能,推荐使用成熟的第三方库如 jsplumb 或 vue-draggable。这些库提供了丰富的 API 和事件支持,能够简化开…

vue的指令实现

vue的指令实现

Vue 指令的实现方式 Vue 指令是带有 v- 前缀的特殊属性,用于在 DOM 元素上应用响应式行为。Vue 提供了一些内置指令(如 v-model、v-if),同时也支持自定义指令。 内置指令…