当前位置:首页 > 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

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

相关文章

vue的指令实现

vue的指令实现

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

vue实现图表拖拽

vue实现图表拖拽

Vue 实现图表拖拽功能 在 Vue 中实现图表拖拽功能,可以通过结合第三方图表库(如 ECharts、Chart.js)和拖拽库(如 interact.js、draggable)来完成。以下是几种常…

vue如何实现拖拽

vue如何实现拖拽

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

vue拖拽功能实现

vue拖拽功能实现

Vue 拖拽功能实现方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,通过 draggable 属性和相关事件实现基础拖拽功能。 <template>…

vue实现左右拖拽

vue实现左右拖拽

Vue 实现左右拖拽功能 使用 HTML5 拖放 API 在 Vue 中可以利用 HTML5 的原生拖放 API 实现左右拖拽功能。通过 draggable 属性标记可拖拽元素,并监听 dragsta…

单独实现vue指令

单独实现vue指令

实现自定义 Vue 指令 在 Vue 中自定义指令可以通过全局或局部方式注册,用于直接操作 DOM 或添加特定行为。以下是实现方法: 全局注册指令 Vue.directive('focus', {…