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

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

vue快速实现拖拽指令

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

相关文章

vue拖拽实现方式

vue拖拽实现方式

Vue拖拽实现方式 使用HTML5原生拖拽API HTML5提供了原生的拖拽API,可以通过draggable属性、dragstart、dragend、dragover和drop等事件实现基础拖拽功能…

vue实现图标拖拽

vue实现图标拖拽

Vue 实现图标拖拽 使用 HTML5 拖放 API 在 Vue 中实现图标拖拽可以利用 HTML5 的拖放 API。通过 draggable 属性标记可拖拽元素,并监听 dragstart、drag…

vue拖拽容器实现

vue拖拽容器实现

实现 Vue 拖拽容器的基本方法 使用 HTML5 原生拖拽 API 通过 draggable 属性和拖拽事件(dragstart、dragend、dragover、drop)实现基础拖拽功能。适用于…

vue实现拖拽到容器里

vue实现拖拽到容器里

实现拖拽到容器的基本步骤 安装并引入 Vue.Draggable 库,这是一个基于 Sortable.js 的 Vue 拖拽组件。可以通过 npm 或 yarn 进行安装。 npm install…

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 dragg…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document…