canvas宽高必须用html属性定义,因width/height决定内部像素缓冲区分辨率;仅用css设置仅缩放显示尺寸,导致图像拉伸、坐标错乱、描边变粗。

Canvas 渲染区域必须用 width 和 height HTML 属性定义,不能靠 CSS 设置 —— 否则坐标错乱、图像拉伸、描边变粗,所有绘图逻辑都会失效。
为什么 canvas 的宽高必须写在 HTML 属性里
Canvas 是一块“像素缓冲区”,width 和 height 属性直接决定其内在分辨率(即位图的像素总数)。CSS 的 style="width:800px;height:600px" 只是缩放显示尺寸,不改变缓冲区大小:
- 若 HTML 属性为
width="400" height="300",但用 CSS 拉到 800×600,浏览器会把 400×300 像素强行拉伸填充 —— 所有图形模糊、圆变椭、坐标系被压缩 -
ctx.fillRect(100, 100, 50, 50)实际画在第 100 列/行像素上;拉伸后,视觉位置偏移,动画轨迹错乱 - 默认值是
width="300" height="150",不显式声明就等于默认画布小且易被误判
如何正确初始化 canvas 元素并获取绘图上下文
拿到 DOM 元素后,必须调用 getContext("2d") 才能开始绘图 —— canvas 自身不提供任何绘制能力:
- ✅ 正确顺序:
const canvas = document.getElementById("myCanvas"); const ctx = canvas.getContext("2d"); - ⚠️ 同一个
canvas只能获取一种上下文:选了"2d"就不能再取"webgl",反之亦然 - ⚠️ 如果页面未加载完成就执行 JS(比如脚本放在
),getElementById可能返回null;建议用window.onload或将 script 放在前 - ? 提示文本写在标签内部即可:
<canvas width="400" height="300">您的浏览器不支持 Canvas</canvas>,旧浏览器会显示该文字
常见错误:CSS 拉伸 + 未重置坐标系导致的视觉偏差
即使 HTML 属性设对了,如果后续用 CSS 改变显示尺寸,又没同步调整绘图逻辑,问题立刻出现:
- 错误现象:
fillRect(0,0,100,100)看起来只占画布左上角四分之一,或线条粗得离谱 - 原因:CSS 缩放让每个像素被渲染为多个物理像素,但
ctx.lineWidth = 1仍按原始缓冲区算 —— 实际显示变粗 2 倍 - 修复方式(二选一):
– 彻底不用 CSS 控制 canvas 尺寸,靠 HTML 属性适配布局
– 若必须响应式,监听窗口变化,动态重设canvas.width/canvas.height并重绘(不能只改 style)
最容易被忽略的是:canvas 不是“自动刷新”的视图层,它没有 DOM diff 或图层管理。每次修改都依赖你手动清除+重画 —— 这既是性能优势的来源,也是出错率最高的环节。别指望改个变量它就自动更新画面。











