当前位置:首页 > JavaScript

js实现拖动div

2026-01-30 08:46:42JavaScript

实现拖动 div 的基本思路

通过监听鼠标事件(mousedownmousemovemouseup)来实现拖拽功能。需要记录拖拽元素的初始位置和鼠标的初始位置,并在移动时计算偏移量。

基础代码实现

<div id="draggable" style="width: 100px; height: 100px; background: red; position: absolute;"></div>
const draggable = document.getElementById('draggable');
let isDragging = false;
let offsetX, offsetY;

draggable.addEventListener('mousedown', (e) => {
  isDragging = true;
  offsetX = e.clientX - draggable.offsetLeft;
  offsetY = e.clientY - draggable.offsetTop;
});

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  draggable.style.left = `${e.clientX - offsetX}px`;
  draggable.style.top = `${e.clientY - offsetY}px`;
});

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

优化边界限制

为了防止拖拽元素超出视口范围,可以添加边界检查逻辑。

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

  let left = e.clientX - offsetX;
  let top = e.clientY - offsetY;

  // 限制在视口范围内
  left = Math.max(0, Math.min(left, window.innerWidth - draggable.offsetWidth));
  top = Math.max(0, Math.min(top, window.innerHeight - draggable.offsetHeight));

  draggable.style.left = `${left}px`;
  draggable.style.top = `${top}px`;
});

支持多元素拖拽

如果需要支持多个可拖拽元素,可以为每个元素单独绑定事件。

document.querySelectorAll('.draggable').forEach(el => {
  let isDragging = false;
  let offsetX, offsetY;

  el.addEventListener('mousedown', (e) => {
    isDragging = true;
    offsetX = e.clientX - el.offsetLeft;
    offsetY = e.clientY - el.offsetTop;
  });

  document.addEventListener('mousemove', (e) => {
    if (!isDragging) return;
    el.style.left = `${e.clientX - offsetX}px`;
    el.style.top = `${e.clientY - offsetY}px`;
  });

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

使用 CSS 优化拖拽体验

为拖拽元素添加 user-select: none 防止拖拽时选中文本,并添加 cursor: move 提示可拖拽。

.draggable {
  user-select: none;
  cursor: move;
}

兼容移动端触摸事件

如果需要支持移动端,可以添加触摸事件处理。

js实现拖动div

draggable.addEventListener('touchstart', (e) => {
  isDragging = true;
  offsetX = e.touches[0].clientX - draggable.offsetLeft;
  offsetY = e.touches[0].clientY - draggable.offsetTop;
});

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

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

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

相关文章

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…