You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:绘图Canvas在页面中偏移的原因及修复方法

Canvas绘制坐标偏移问题修复方案

问题根源

你代码里直接用e.clientX/e.clientY作为Canvas的绘制坐标,这两个值是鼠标相对于浏览器视口左上角的位置,而非Canvas元素自身左上角的本地坐标。当Canvas不在视口左上角时,必然出现绘制点偏移。另外Canvas的CSS尺寸(350px高)和绘图上下文设置的尺寸(375px高)不一致,会导致绘制内容拉伸,也会加重偏移问题。

修复步骤

1. 统一Canvas尺寸

修改resize函数,让绘图上下文尺寸和CSS定义的Canvas尺寸保持一致:

function resize() {
  ctx.canvas.width = 650;
  ctx.canvas.height = 350; // 匹配CSS中的.height: 350px
}

2. 转换鼠标坐标为Canvas本地坐标

更新setPosition函数,计算鼠标相对于Canvas左上角的真实位置:

function setPosition(e) {
  const canvas = document.getElementById("canvas");
  // 获取Canvas在视口中的位置边界
  const rect = canvas.getBoundingClientRect();
  // 计算相对于Canvas左上角的坐标
  pos.x = e.clientX - rect.left;
  pos.y = e.clientY - rect.top;
}

3. 优化事件监听(可选)

将绘制相关事件绑定到Canvas元素上,避免在Canvas外操作触发无效逻辑:

// 替换原document上的事件监听
canvas.addEventListener('mousemove', draw);
canvas.addEventListener('mousedown', setPosition);
canvas.addEventListener('mousemove', setPosition);

修正后的核心代码片段

// last known position
var pos = { x: 0, y: 0 };

window.addEventListener('resize', resize);
button.addEventListener('click', clear)
// 绑定事件到Canvas元素
canvas.addEventListener('mousemove', draw);
canvas.addEventListener('mousedown', setPosition);
canvas.addEventListener('mousemove', setPosition);


// new position from mouse event
function setPosition(e) {
  const canvas = document.getElementById("canvas");
  const rect = canvas.getBoundingClientRect();
  pos.x = e.clientX - rect.left;
  pos.y = e.clientY - rect.top;
}

// resize canvas
function resize() {
  ctx.canvas.width = 650;
  ctx.canvas.height = 350; // 匹配CSS高度
}

内容的提问来源于stack exchange,提问作者halted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:55:17