当前位置:首页 > JavaScript

js实现div拖拽

2026-04-04 06:32:55JavaScript

实现div拖拽的基本思路

通过监听鼠标事件(mousedown、mousemove、mouseup)来实现拖拽效果。记录鼠标按下时的初始位置和元素初始位置,计算移动距离并更新元素位置。

基本实现代码

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;
  draggable.style.cursor = 'grabbing';
});

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;
  draggable.style.cursor = 'grab';
});

CSS样式要求

确保拖拽元素使用绝对定位:

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

边界限制实现

防止元素被拖出可视区域:

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

  let newX = e.clientX - offsetX;
  let newY = e.clientY - offsetY;

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

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

拖拽手柄实现

如果只需要特定区域触发拖拽:

const handle = document.querySelector('.drag-handle');
handle.addEventListener('mousedown', (e) => {
  // 拖拽逻辑相同
});

使用HTML5拖拽API

另一种实现方式:

draggable.draggable = true;

draggable.addEventListener('dragstart', (e) => {
  e.dataTransfer.setData('text/plain', draggable.id);
  e.dataTransfer.effectAllowed = 'move';
});

document.addEventListener('dragover', (e) => {
  e.preventDefault();
});

document.addEventListener('drop', (e) => {
  e.preventDefault();
  const id = e.dataTransfer.getData('text/plain');
  const el = document.getElementById(id);
  el.style.left = `${e.clientX}px`;
  el.style.top = `${e.clientY}px`;
});

性能优化建议

对于频繁触发的mousemove事件,可以使用requestAnimationFrame进行节流:

js实现div拖拽

let animationId;
document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  cancelAnimationFrame(animationId);
  animationId = requestAnimationFrame(() => {
    // 更新位置逻辑
  });
});

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

相关文章

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js图片轮播的实现

js图片轮播的实现

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

js实现定位

js实现定位

使用Geolocation API获取当前位置 在JavaScript中,可以通过浏览器内置的Geolocation API获取用户的地理位置信息。该API需要用户授权才能访问位置数据。 if (n…