当前位置:首页 > JavaScript

实现画布拖拽js

2026-03-01 18:14:42JavaScript

实现画布拖拽的基本思路

通过JavaScript监听鼠标事件(mousedown、mousemove、mouseup)来计算画布位移。核心是通过记录鼠标按下时的初始位置和移动时的偏移量,动态更新画布的transform样式或直接修改left/top值。

基础实现代码示例

<div id="canvas" style="width: 500px; height: 500px; background: #eee; position: absolute;"></div>
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;
});

使用CSS Transform优化性能

推荐使用transform而非直接修改left/top,因为前者不会触发重排(reflow),性能更好。若需支持惯性滑动等高级效果,可结合requestAnimationFrame

实现画布拖拽js

let lastX = 0, lastY = 0;
let velocityX = 0, velocityY = 0;
const friction = 0.95;

function animate() {
  velocityX *= friction;
  velocityY *= friction;
  offsetX += velocityX;
  offsetY += velocityY;
  canvas.style.transform = `translate(${offsetX}px, ${offsetY}px)`;
  requestAnimationFrame(animate);
}
animate();

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  velocityX = e.movementX;
  velocityY = e.movementY;
  offsetX += e.movementX;
  offsetY += e.movementY;
});

边界限制处理

防止画布被拖出可视区域,可在mousemove事件中添加边界检查:

实现画布拖拽js

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

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

触摸屏适配

添加touchstarttouchmovetouchend事件支持:

canvas.addEventListener('touchstart', (e) => {
  isDragging = true;
  const touch = e.touches[0];
  startX = touch.clientX - offsetX;
  startY = touch.clientY - offsetY;
  e.preventDefault();
});

document.addEventListener('touchmove', (e) => {
  if (!isDragging) return;
  const touch = e.touches[0];
  offsetX = touch.clientX - startX;
  offsetY = touch.clientY - startY;
  canvas.style.transform = `translate(${offsetX}px, ${offsetY}px)`;
  e.preventDefault();
});

使用第三方库简化

若项目复杂,可考虑使用现成库:

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

相关文章

Vue实现画布

Vue实现画布

Vue 实现画布的方法 在 Vue 中实现画布功能可以通过 HTML5 的 <canvas> 元素结合 Vue 的响应式特性来完成。以下是几种常见的实现方式: 使用原生 <canv…

vue 实现拖拽甘特图

vue 实现拖拽甘特图

实现拖拽甘特图的核心思路 Vue 实现拖拽甘特图需要结合第三方库或自定义逻辑,核心功能包括任务条渲染、时间轴刻度、拖拽交互、数据绑定等。以下是具体实现方法: 使用第三方库(推荐) vue-gantt…

vue实现拖拽连线

vue实现拖拽连线

Vue 实现拖拽连线的方法 使用第三方库(推荐) 对于快速实现拖拽连线功能,推荐使用成熟的第三方库如 jsplumb 或 vue-draggable。这些库提供了丰富的 API 和事件支持,能够简化开…

vue实现列拖拽

vue实现列拖拽

Vue 实现列拖拽功能 使用原生 HTML5 拖放 API 在 Vue 中可以通过原生 HTML5 的拖放 API 实现列拖拽功能。需要处理 draggable、dragstart、dragover…

vue实现简单拖拽

vue实现简单拖拽

Vue 实现简单拖拽功能 在 Vue 中实现拖拽功能可以通过 HTML5 的拖放 API 或第三方库(如 vuedraggable)来完成。以下是两种常见的实现方式: 使用 HTML5 拖放 API…

vue实现横向拖拽

vue实现横向拖拽

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