当前位置:首页 > JavaScript

实现画布拖拽js

2026-04-04 19:03:05JavaScript

实现画布拖拽的基本思路

通过监听鼠标事件(mousedownmousemovemouseup)计算画布偏移量,结合 CSS 的 transform 或直接修改 left/top 实现拖拽效果。

核心代码实现

HTML 结构

<div id="canvas" style="width: 500px; height: 300px; background: #eee; position: relative;"></div>

JavaScript 逻辑

const canvas = document.getElementById('canvas');
let isDragging = false;
let startX, startY;
let offsetX = 0, offsetY = 0;

canvas.addEventListener('mousedown', (e) => {
  isDragging = true;
  startX = e.clientX - offsetX;
  startY = e.clientY - offsetY;
});

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  offsetX = e.clientX - startX;
  offsetY = e.clientY - startY;
  canvas.style.transform = `translate(${offsetX}px, ${offsetY}px)`;
});

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

优化方向

边界限制 防止画布拖出可视区域:

const maxX = window.innerWidth - canvas.offsetWidth;
const maxY = window.innerHeight - canvas.offsetHeight;

offsetX = Math.max(0, Math.min(offsetX, maxX));
offsetY = Math.max(0, Math.min(offsetY, maxY));

惯性滑动 通过记录移动速度实现惯性效果:

实现画布拖拽js

let lastX = 0, lastY = 0;
let speedX = 0, speedY = 0;
let lastTime = 0;

// 在 mousemove 中记录速度
const now = Date.now();
if (lastTime) {
  const deltaTime = now - lastTime;
  speedX = (offsetX - lastX) / deltaTime;
  speedY = (offsetY - lastY) / deltaTime;
}
lastX = offsetX;
lastY = offsetY;
lastTime = now;

// mouseup 后继续滑动
function animate() {
  if (!isDragging && (Math.abs(speedX) > 0.1 || Math.abs(speedY) > 0.1)) {
    offsetX += speedX * 16;
    offsetY += speedY * 16;
    speedX *= 0.95;
    speedY *= 0.95;
    canvas.style.transform = `translate(${offsetX}px, ${offsetY}px)`;
    requestAnimationFrame(animate);
  }
}

完整示例代码

<!DOCTYPE html>
<div id="canvas" style="width: 500px; height: 300px; background: #eee;"></div>
<script>
  const canvas = document.getElementById('canvas');
  let isDragging = false;
  let startX, startY;
  let offsetX = 0, offsetY = 0;

  canvas.style.transform = 'translate(0, 0)';
  canvas.style.cursor = 'grab';

  canvas.addEventListener('mousedown', (e) => {
    isDragging = true;
    startX = e.clientX - offsetX;
    startY = e.clientY - offsetY;
    canvas.style.cursor = 'grabbing';
  });

  document.addEventListener('mousemove', (e) => {
    if (!isDragging) return;
    offsetX = e.clientX - startX;
    offsetY = e.clientY - startY;
    canvas.style.transform = `translate(${offsetX}px, ${offsetY}px)`;
  });

  document.addEventListener('mouseup', () => {
    isDragging = false;
    canvas.style.cursor = 'grab';
  });
</script>

标签: 画布拖拽
分享给朋友:

相关文章

vue实现面板拖拽

vue实现面板拖拽

Vue 实现面板拖拽的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。 在 Vue 模板中为元素添加 dra…

vue实现卡片拖拽

vue实现卡片拖拽

Vue 实现卡片拖拽的方法 使用 HTML5 拖放 API HTML5 提供了原生拖放 API,结合 Vue 可以轻松实现拖拽功能。以下是一个基本实现示例: <template> &…

vue 实现拖拽布局

vue 实现拖拽布局

Vue 实现拖拽布局的方法 使用原生HTML5拖拽API 通过HTML5的draggable属性和Vue的事件绑定实现基础拖拽功能。在元素上添加draggable="true",并通过@dragsta…

vue实现树形拖拽

vue实现树形拖拽

Vue 实现树形拖拽的方法 使用 vue-draggable 插件 安装 vue-draggable 插件: npm install vuedraggable --save 在组件中引入并使用:…

vue实现横向拖拽

vue实现横向拖拽

实现横向拖拽的基本思路 使用 Vue 实现横向拖拽功能通常涉及监听鼠标事件(mousedown、mousemove、mouseup),计算拖拽距离,并动态更新元素位置。以下是核心实现方法: 基础实现…

vue 实现拖拽事件

vue 实现拖拽事件

实现拖拽事件的基本步骤 在Vue中实现拖拽功能可以通过HTML5的Drag and Drop API或第三方库如vuedraggable来完成。以下是两种方法的详细说明。 使用HTML5 Drag…