之前,或者使用 DOMContentLoaded 事件包裹代码。
这一点看似简单,但很多人容易犯错。在 style 中设置 width: 300px; height: 150px,视觉上画布确实变大了,但绘制的图形会被严重拉伸,导致失真。原因在于:CSS 只控制显示比例,不会改变 canvas 底层的像素网格。canvas 的默认尺寸是 300×150 像素,CSS 缩放会将 300×150 的像素点强行拉伸到更大区域,分辨率不变,画面自然模糊。
正确的写法是:。如果同时使用 width/height 属性和 CSS,CSS 会覆盖渲染分辨率,结果仍然失真。
如果需要响应式 canvas,必须使用 JavaScript 动态读取父容器尺寸,重新设置 canvas.width 和 canvas.height,然后重绘所有内容。这一步比预想中复杂,但无法跳过。
很多时候代码逻辑没有错误,但画布要么空白,要么只显示部分图形。常见原因并非语法错误,而是坐标系和默认状态没有理清。
首先,fillRect(0, 0, 100, 100) 从左上角开始绘制矩形。但如果 canvas 的 width/height 属性未设置,默认尺寸为 300×150,而绘制的矩形尺寸可能超出该区域——例如画一个 400×400 的矩形,只会显示左上角的一部分。
其次,fillStyle 默认值为黑色(#000000)。如果页面背景也是深色,图形会与背景融为一体,相当于“隐形”。解决方案很简单:显式设置 ctx.fillStyle = "#ff0000",或者先清空背景,例如使用 fillRect 铺设一层浅色底色。
路径操作是另一个常见问题。绘制线条、圆弧、贝塞尔曲线等需要构建路径的操作时,每次开始新形状之前必须调用一次 beginPath()。否则路径会不断累加,导致新线条与旧线条意外连接,出现奇怪的折线或闭环。这是新手最容易忽略的细节。
还有一个容易被低估的问题:部分旧版浏览器(如 Safari)对 canvas 的 toDataURL() 或导出操作有安全限制。如果使用了跨域图片,且未设置 crossOrigin 属性,浏览器会直接报 SecurityError 并中断操作。
canvas 是位图,而非矢量容器。这意味着每次重绘都需要手动清除旧内容。例如在制作动画或交互反馈时,必须使用 clearRect() 清除上一帧的内容,否则画面会出现拖影,残留上一个状态的图形。这与 DOM 元素的更新机制完全不同——浏览器不会自动刷新 canvas 上的内容,必须由开发者自己管理“脏区域”。很多人在制作简单动画时出错,往往是因为忘记清屏。
从获取上下文、设置尺寸、管理默认状态,到主动清理画布,每一步都有细节。但理解这些之后,canvas 就变成一张完全受你控制的画布,可以绘制任何想要的图形。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述