当前位置:首页 > JavaScript

js实现方块拖曳

2026-02-02 15:46:00JavaScript

实现方块拖曳的基本步骤

通过监听鼠标事件(mousedownmousemovemouseup)实现拖曳功能。以下是核心代码示例:

const box = document.getElementById('draggable-box');
let isDragging = false;
let offsetX, offsetY;

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

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

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

CSS 基础样式

确保方块使用绝对定位以便移动:

#draggable-box {
  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 - box.offsetWidth;
  const maxY = window.innerHeight - box.offsetHeight;

  box.style.left = `${Math.min(Math.max(0, x), maxX)}px`;
  box.style.top = `${Math.min(Math.max(0, y), maxY)}px`;
});

触摸屏支持

添加触摸事件以实现移动端兼容:

box.addEventListener('touchstart', (e) => {
  isDragging = true;
  const touch = e.touches[0];
  offsetX = touch.clientX - box.getBoundingClientRect().left;
  offsetY = touch.clientY - box.getBoundingClientRect().top;
});

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

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

性能优化

使用 transform 替代 left/top 提升动画性能:

js实现方块拖曳

box.style.transform = `translate(${x}px, ${y}px)`;

完整示例

查看 CodePen 完整示例(需替换为实际链接)

标签: 方块js
分享给朋友:

相关文章

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…

js 实现递归

js 实现递归

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

js 实现超链接

js 实现超链接

使用 HTML 的 <a> 标签 在 JavaScript 中动态创建超链接可以通过操作 DOM 实现。通过 document.createElement 创建一个 <a> 元…

vue.js实现app

vue.js实现app

Vue.js 实现 App 的方法 Vue.js 可以用于开发移动端 App,主要通过以下两种方式实现: 使用 Capacitor 或 Cordova 进行混合开发 Capacitor 和 Cor…