当前位置:首页 > JavaScript

js实现拖拽

2026-02-28 17:18:10JavaScript

实现拖拽的基本原理

拖拽功能主要通过监听鼠标事件实现,包括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';
});

拖拽边界限制

为防止元素被拖出可视区域,可以添加边界检查:

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`;
});

拖拽事件优化

使用transform代替top/left可以获得更好的性能:

let posX = 0, posY = 0;

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  posX = e.clientX - offsetX;
  posY = e.clientY - offsetY;
  draggableElement.style.transform = `translate(${posX}px, ${posY}px)`;
});

拖拽放置区域实现

实现拖拽元素到特定区域放置的功能:

const dropZone = document.getElementById('drop-zone');

draggableElement.addEventListener('dragstart', () => {
  draggableElement.classList.add('dragging');
});

dropZone.addEventListener('dragover', (e) => {
  e.preventDefault();
  dropZone.classList.add('drag-over');
});

dropZone.addEventListener('drop', () => {
  dropZone.appendChild(draggableElement);
  dropZone.classList.remove('drag-over');
});

触摸屏拖拽支持

添加触摸事件支持使功能在移动设备上可用:

draggableElement.addEventListener('touchstart', (e) => {
  const touch = e.touches[0];
  offsetX = touch.clientX - draggableElement.getBoundingClientRect().left;
  offsetY = touch.clientY - draggableElement.getBoundingClientRect().top;
  isDragging = true;
});

document.addEventListener('touchmove', (e) => {
  if (!isDragging) return;
  const touch = e.touches[0];
  draggableElement.style.left = `${touch.clientX - offsetX}px`;
  draggableElement.style.top = `${touch.clientY - offsetY}px`;
  e.preventDefault();
});

document.addEventListener('touchend', () => {
  isDragging = false;
});

CSS样式建议

为拖拽元素添加基本样式提升用户体验:

js实现拖拽

#draggable {
  position: absolute;
  cursor: grab;
  user-select: none;
  touch-action: none;
}

#draggable:active {
  cursor: grabbing;
}

#drop-zone {
  border: 2px dashed #ccc;
  min-height: 100px;
}

.drag-over {
  background-color: #f0f0f0;
}

标签: 拖拽js
分享给朋友:

相关文章

vue 实现卡片拖拽

vue 实现卡片拖拽

Vue 实现卡片拖拽 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

vue拖拽实现方式

vue拖拽实现方式

Vue 拖拽实现方式 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件(如 dragstart、dragend、dragover、…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…