当前位置:首页 > 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实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js实现滚动

js实现滚动

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