当前位置:首页 > JavaScript

实现画布拖拽js

2026-04-04 19:03:05JavaScript

实现画布拖拽的基本思路

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

核心代码实现

HTML 结构

实现画布拖拽js

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

JavaScript 逻辑

实现画布拖拽js

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));

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

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 属性、dragstart、dragend、dragover 和 dro…

拖拽实现vue

拖拽实现vue

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

vue拖拽容器实现

vue拖拽容器实现

Vue 拖拽容器实现方法 在 Vue 中实现拖拽容器功能可以通过原生 HTML5 的拖放 API 或第三方库如 vuedraggable 来实现。以下是两种方法的详细说明。 使用 HTML5 拖放…

jquery 拖拽

jquery 拖拽

jQuery 拖拽实现方法 使用 jQuery 实现拖拽功能可以通过多种方式完成,以下是常见的几种方法: 使用 jQuery UI 的拖拽功能 jQuery UI 提供了 draggable 方法,…

vue实现图表拖拽

vue实现图表拖拽

Vue 实现图表拖拽功能 在 Vue 中实现图表拖拽功能,可以通过结合第三方图表库(如 ECharts、Chart.js)和拖拽库(如 interact.js、draggable)来完成。以下是几种常…

vue如何实现拖拽

vue如何实现拖拽

实现拖拽的基本方法 在Vue中实现拖拽功能通常使用HTML5的Drag and Drop API或第三方库如vuedraggable。以下是两种方法的详细说明。 使用HTML5 Drag and D…