当前位置:首页 > 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';
});

拖拽边界限制

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

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

拖拽事件优化

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

拖拽放置区域实现

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

js实现拖拽

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样式建议

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

#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 属性和相关事件实现拖拽功能。 <template> &l…

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

vue实现拖拽div

vue实现拖拽div

Vue 实现拖拽 Div 的方法 使用原生 HTML5 拖拽 API HTML5 提供了原生的拖拽 API,结合 Vue 的事件绑定可以快速实现拖拽功能。以下是实现步骤: <template…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…