当前位置:首页 > 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

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事件中添加边界检查:

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

使用第三方库简化

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

实现画布拖拽js

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

相关文章

vue拖拽实现方式

vue拖拽实现方式

Vue 拖拽实现方式 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件(如 dragstart、dragend、dragover、…

vue实现盒子拖拽

vue实现盒子拖拽

实现盒子拖拽的基本思路 在Vue中实现盒子拖拽功能,可以通过监听鼠标事件(mousedown、mousemove、mouseup)来实现。核心逻辑是记录拖拽起始位置,计算位移差值,并更新盒子的位置。…

vue实现简单拖拽

vue实现简单拖拽

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

vue实现卡片拖拽

vue实现卡片拖拽

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

vue实现dom拖拽

vue实现dom拖拽

Vue 实现 DOM 拖拽 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。在 Vue 中,可以通过绑定这些事件来实…

vue栅格拖拽怎么实现

vue栅格拖拽怎么实现

实现Vue栅格拖拽的方法 使用Vue实现栅格拖拽功能可以通过第三方库或原生HTML5拖拽API完成。以下是几种常见实现方式: 使用Vue.Draggable库 Vue.Draggable是基于Sor…