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

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

js实现拖动元素

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

优化版本(边界限制)

防止元素被拖出视窗:

js实现拖动元素

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

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

相关文章

vue怎么实现拖动数据

vue怎么实现拖动数据

实现拖动数据的基本方法 在Vue中实现拖动数据通常使用HTML5的拖放API或第三方库如vuedraggable。以下是两种常见方法的详细说明: 使用HTML5原生拖放API HTML5提供了dra…

jquery 父元素

jquery 父元素

jQuery 获取父元素的方法 在 jQuery 中,可以通过多种方法获取元素的父元素。以下是常用的几种方式: 使用 parent() 方法 parent() 方法返回被选元素的直接父元素。例如:…

vue实现拖动刻度

vue实现拖动刻度

实现拖动刻度功能 在Vue中实现拖动刻度功能可以通过结合原生HTML5的拖拽API和Vue的数据绑定特性来完成。以下是一个完整的实现方案: 基本实现思路 创建一个可拖动的滑块元素 监听鼠标事件处理拖…

vue实现拖动栏

vue实现拖动栏

Vue 实现拖动栏 使用 HTML5 拖放 API HTML5 提供了原生的拖放 API,可以直接在 Vue 中使用。通过 draggable 属性标记可拖动元素,并监听 dragstart、drag…

vue实现可拖动

vue实现可拖动

Vue 实现可拖动功能 在 Vue 中实现可拖动功能通常可以通过原生 HTML5 的拖放 API 或第三方库如 vuedraggable 来完成。以下是两种方法的详细说明: 使用 HTML5 拖放…

vue实现元素移动效果

vue实现元素移动效果

使用 CSS Transition 实现基础移动 在 Vue 中可以通过数据绑定结合 CSS transition 实现平滑移动效果。定义数据属性控制元素位置,通过修改数据触发动画。 <tem…