当前位置:首页 > JavaScript

js实现div拖动

2026-03-01 01:25:54JavaScript

实现div拖动的基本思路

通过监听鼠标事件(mousedown、mousemove、mouseup)来实现拖动效果。核心逻辑是记录初始位置偏移量,并在移动时更新元素位置。

基础实现代码

const draggableDiv = document.getElementById('draggable');

let isDragging = false;
let offsetX, offsetY;

draggableDiv.addEventListener('mousedown', (e) => {
  isDragging = true;
  offsetX = e.clientX - draggableDiv.getBoundingClientRect().left;
  offsetY = e.clientY - draggableDiv.getBoundingClientRect().top;
  draggableDiv.style.cursor = 'grabbing';
});

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

  draggableDiv.style.left = `${e.clientX - offsetX}px`;
  draggableDiv.style.top = `${e.clientY - offsetY}px`;
});

document.addEventListener('mouseup', () => {
  isDragging = false;
  draggableDiv.style.cursor = 'grab';
});

CSS准备

确保div有position属性且初始位置设置:

#draggable {
  position: absolute;
  width: 100px;
  height: 100px;
  background-color: #3498db;
  cursor: grab;
  user-select: none;
}

边界限制实现

防止元素被拖出视窗:

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

  const x = e.clientX - offsetX;
  const y = e.clientY - offsetY;
  const maxX = window.innerWidth - draggableDiv.offsetWidth;
  const maxY = window.innerHeight - draggableDiv.offsetHeight;

  draggableDiv.style.left = `${Math.min(Math.max(0, x), maxX)}px`;
  draggableDiv.style.top = `${Math.min(Math.max(0, 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;

  draggableDiv.style.transform = `translate(${posX}px, ${posY}px)`;
});

完整封装函数

可复用的拖动初始化函数:

function makeDraggable(element) {
  let isDragging = false;
  let offsetX, offsetY;

  element.addEventListener('mousedown', (e) => {
    isDragging = true;
    const rect = element.getBoundingClientRect();
    offsetX = e.clientX - rect.left;
    offsetY = e.clientY - rect.top;
    element.style.cursor = 'grabbing';
  });

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

    element.style.left = `${e.clientX - offsetX}px`;
    element.style.top = `${e.clientY - offsetY}px`;
  });

  document.addEventListener('mouseup', () => {
    isDragging = false;
    element.style.cursor = 'grab';
  });
}

js实现div拖动

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

相关文章

vue实现拖动

vue实现拖动

Vue实现拖动的常用方法 在Vue中实现拖动功能通常需要结合HTML5的拖放API或第三方库。以下是几种常见实现方式: 使用HTML5原生拖放API HTML5提供了原生拖放API,可以通过drag…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounc…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = documen…

vue如何实现拖动

vue如何实现拖动

Vue 实现拖动的常用方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件实现拖动功能。 <template>…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…