当前位置:首页 > VUE

vue快速实现拖拽指令

2026-01-20 07:16:32VUE

基础拖拽指令实现

通过v-drag指令实现元素拖拽功能,核心是利用鼠标事件和CSS变换:

Vue.directive('drag', {
  inserted(el) {
    el.style.cursor = 'move';
    let startX = 0, startY = 0;

    el.addEventListener('mousedown', (e) => {
      startX = e.clientX - el.getBoundingClientRect().left;
      startY = e.clientY - el.getBoundingClientRect().top;

      document.addEventListener('mousemove', move);
      document.addEventListener('mouseup', up);
    });

    function move(e) {
      el.style.left = e.clientX - startX + 'px';
      el.style.top = e.clientY - startY + 'px';
    }

    function up() {
      document.removeEventListener('mousemove', move);
      document.removeEventListener('mouseup', up);
    }
  }
})

使用前确保目标元素有position: absolute样式:

<div v-drag style="position:absolute">可拖拽元素</div>

带边界限制的拖拽

增加边界检测逻辑防止元素被拖出可视区域:

function move(e) {
  const maxX = window.innerWidth - el.offsetWidth;
  const maxY = window.innerHeight - el.offsetHeight;

  let x = e.clientX - startX;
  let y = e.clientY - startY;

  x = Math.max(0, Math.min(x, maxX));
  y = Math.max(0, Math.min(y, maxY));

  el.style.left = x + 'px';
  el.style.top = y + 'px';
}

拖拽手柄实现

仅允许特定区域触发拖拽:

Vue.directive('drag', {
  inserted(el, binding) {
    const handle = binding.value 
      ? el.querySelector(binding.value) 
      : el;

    handle.style.cursor = 'move';
    // 其余逻辑与基础实现相同
  }
})

使用时指定手柄选择器:

<div v-drag="'.handle'">
  <div class="handle">拖拽区</div>
  <div>内容区</div>
</div>

拖拽数据绑定

通过指令参数传递拖拽位置数据:

function move(e) {
  // ...计算x,y...
  if (binding.arg) {
    Vue.set(binding.value, binding.arg, {x, y});
  }
}

组件内使用方式:

data() {
  return { pos: {x:0, y:0} }
}
<div v-drag:pos="pos" :style="{left:pos.x+'px',top:pos.y+'px'}"></div>

触摸屏适配

添加触摸事件支持:

el.addEventListener('touchstart', (e) => {
  const touch = e.touches[0];
  startX = touch.clientX - el.getBoundingClientRect().left;
  // 其余逻辑类似mousedown
});

document.addEventListener('touchmove', touchMove);
document.addEventListener('touchend', up);

性能优化建议

使用CSS transform替代top/left减少重排:

el.style.transform = `translate(${x}px, ${y}px)`;

添加防抖处理高频mousemove事件:

vue快速实现拖拽指令

function move(e) {
  requestAnimationFrame(() => {
    // 位置计算逻辑
  });
}

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

相关文章

vue指令实现

vue指令实现

Vue 指令的实现方式 Vue 指令是特殊的标记,用于在 DOM 元素上应用特定的行为。可以通过全局或局部方式注册自定义指令。 全局注册指令 在 Vue 应用中通过 Vue.directive 方法…

vue实现拖拽改变尺寸

vue实现拖拽改变尺寸

Vue 实现拖拽改变尺寸的方法 使用原生 HTML5 拖拽 API 通过监听 mousedown、mousemove 和 mouseup 事件实现拖拽改变尺寸。创建一个可拖拽的边界元素,调整目标元素的…

vue实现拖拽连接

vue实现拖拽连接

Vue 实现拖拽连接功能 在 Vue 中实现拖拽连接功能通常涉及使用 HTML5 的拖放 API 或第三方库(如 vuedraggable)。以下是两种常见实现方式: 使用 HTML5 拖放 API…

vue实现carousel拖拽

vue实现carousel拖拽

实现拖拽轮播的基本思路 在Vue中实现可拖拽的Carousel组件需要结合触摸事件(touchstart、touchmove、touchend)和鼠标事件(mousedown、mousemove、mo…

vue实现拖拽连线

vue实现拖拽连线

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

js实现图片拖拽

js实现图片拖拽

实现图片拖拽的基本步骤 HTML 结构需要包含可拖拽的图片元素,并设置 draggable 属性为 true: <img id="dragImage" src="image.jpg" drag…