当前位置:首页 > JavaScript

js实现拖动元素

2026-02-03 02:42:51JavaScript

实现元素拖动的基本原理

通过监听鼠标事件(mousedownmousemovemouseup)实现元素拖动。核心逻辑是计算鼠标移动距离并更新元素位置。

基本实现代码

const draggableElement = document.getElementById('draggable');

let isDragging = false;
let offsetX, offsetY;

draggableElement.addEventListener('mousedown', (e) => {
  isDragging = true;
  offsetX = e.clientX - draggableElement.getBoundingClientRect().left;
  offsetY = e.clientY - draggableElement.getBoundingClientRect().top;

  draggableElement.style.cursor = 'grabbing';
});

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;

  draggableElement.style.left = `${e.clientX - offsetX}px`;
  draggableElement.style.top = `${e.clientY - offsetY}px`;
});

document.addEventListener('mouseup', () => {
  isDragging = false;
  draggableElement.style.cursor = 'grab';
});

CSS 初始设置

确保元素可定位并设置初始样式:

#draggable {
  position: absolute;
  cursor: grab;
  user-select: none; /* 防止拖动时选中文本 */
}

优化版本(边界限制)

防止元素被拖出视窗:

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;

  const x = e.clientX - offsetX;
  const y = e.clientY - offsetY;

  // 视窗边界检测
  const maxX = window.innerWidth - draggableElement.offsetWidth;
  const maxY = window.innerHeight - draggableElement.offsetHeight;

  draggableElement.style.left = `${Math.max(0, Math.min(x, maxX))}px`;
  draggableElement.style.top = `${Math.max(0, Math.min(y, maxY))}px`;
});

使用事件委托实现多元素拖动

document.addEventListener('mousedown', (e) => {
  if (!e.target.classList.contains('draggable')) return;

  const element = e.target;
  const rect = element.getBoundingClientRect();
  const offsetX = e.clientX - rect.left;
  const offsetY = e.clientY - rect.top;

  function moveHandler(e) {
    element.style.left = `${e.clientX - offsetX}px`;
    element.style.top = `${e.clientY - offsetY}px`;
  }

  function upHandler() {
    document.removeEventListener('mousemove', moveHandler);
    document.removeEventListener('mouseup', upHandler);
  }

  document.addEventListener('mousemove', moveHandler);
  document.addEventListener('mouseup', upHandler);
});

使用 HTML5 Drag API 实现

更简单的原生拖动方案:

document.querySelectorAll('.draggable').forEach(el => {
  el.draggable = true;

  el.addEventListener('dragstart', (e) => {
    e.dataTransfer.setData('text/plain', e.target.id);
    e.target.classList.add('dragging');
  });
});

document.addEventListener('dragover', (e) => {
  e.preventDefault();
});

document.addEventListener('drop', (e) => {
  e.preventDefault();
  const id = e.dataTransfer.getData('text/plain');
  const draggable = document.getElementById(id);
  draggable.style.left = `${e.clientX}px`;
  draggable.style.top = `${e.clientY}px`;
  draggable.classList.remove('dragging');
});

性能优化建议

对于频繁触发的 mousemove 事件,可以使用节流(throttling)技术:

function throttle(fn, delay) {
  let lastCall = 0;
  return function(...args) {
    const now = new Date().getTime();
    if (now - lastCall < delay) return;
    lastCall = now;
    return fn(...args);
  };
}

document.addEventListener('mousemove', throttle((e) => {
  // 拖动逻辑
}, 16)); // 约60fps

js实现拖动元素

标签: 拖动元素
分享给朋友:

相关文章

vue实现多个元素

vue实现多个元素

Vue 实现多个元素的方法 在 Vue 中实现多个元素的渲染或操作有多种方式,具体取决于需求场景。以下是常见的几种方法: 使用 v-for 渲染列表 通过 v-for 指令可以动态渲染多个元素,适用…

vue实现向上拖动

vue实现向上拖动

Vue 实现向上拖动功能 实现向上拖动功能通常需要结合 Vue 的指令和事件处理,以及原生 JavaScript 的拖拽 API。以下是几种常见的方法: 使用 HTML5 拖放 API 通过 HT…

vue实现拖动滑动

vue实现拖动滑动

Vue 实现拖动滑动 使用原生 HTML5 拖放 API 在 Vue 中可以通过 @dragstart、@dragover、@drop 等事件实现基础的拖放功能。以下是一个简单的拖放示例: <…

vue实现图片拖动

vue实现图片拖动

Vue 实现图片拖动的步骤 使用 HTML5 拖放 API 在 Vue 中实现图片拖动可以利用 HTML5 的拖放 API。通过 draggable 属性设置元素可拖动,监听 dragstart、dr…

vue实现元素穿梭

vue实现元素穿梭

Vue 实现元素穿梭 在 Vue 中实现元素穿梭功能(即将元素从一个列表移动到另一个列表),可以通过以下方法实现。以下是一个基于 Vue 3 的示例: 基本实现 定义两个数组分别表示左右列表的数据…

vue实现悬浮元素出现

vue实现悬浮元素出现

实现悬浮元素出现的方法 在Vue中实现悬浮元素出现的效果,可以通过结合CSS和Vue的事件绑定来完成。以下是几种常见的实现方式: 使用v-show或v-if指令 通过鼠标移入移出事件控制元素的显示…