canvas绘制自定义线条和多边形的核心是路径控制:先用beginpath()开启新路径,再用moveto()定起点、lineto()连线,最后用stroke()或fill()渲染;开放路径无需closepath(),闭合多边形必须显式调用closepath()才能正确填充和描边。

Canvas 绘制自定义线条和多边形,核心在于路径(path)的构建与控制:先用 beginPath() 开启新路径,再用 moveTo() 定起点,lineTo() 连线,最后用 stroke() 或 fill() 渲染。关键不是“画几条线”,而是“如何精确组织这些线段形成闭合或开放路径”。
绘制任意折线(开放路径)
适合绘制箭头、波浪线、用户手绘轨迹等不闭合图形:
- 调用
ctx.beginPath()清空前序路径状态,避免意外连接 - 用
ctx.moveTo(x, y)设定起笔位置(不画线) - 连续调用
ctx.lineTo(x, y)添加线段端点,每调一次就画一条线到该点 - 最后执行
ctx.stroke()显形;若只描边不填充,无需closePath()
例如画一个Z字形:
ctx.beginPath();<br> ctx.moveTo(50, 50);<br> ctx.lineTo(150, 50);<br> ctx.lineTo(50, 100);<br> ctx.lineTo(150, 100);<br> ctx.stroke();
绘制闭合多边形(三角形、五边形等)
闭合的关键是路径终点自动连回起点,但必须显式调用 closePath():
用户要生成可打印的中文字帖/练习纸、导出多页 A4 PDF 报告,或把 SVG 设计稿零误差还原到 Canvas 时使用。本技能是「Canvas 内容工厂闭环」的总控,编排:网格渲染引擎(13 种教育网格+拼音标注) → 多页 PDF 导出(A4 合成) → SVG 精准复刻(坐标误差<0.001px)。触发词:生成字帖、练习纸、导出 PDF、SVG 转 Canvas、印刷级还原、A4 报告、米字格田字格。
-
moveTo()设第一个顶点 - 用
lineTo()依次设其余顶点(n–1 次) - 调用
ctx.closePath()—— 它会自动添加一条从末点回到起点的线段,并标记路径为闭合 - 用
fill()可填充内部,stroke()描边,两者可同时使用
画实心三角形示例:
ctx.beginPath();<br> ctx.moveTo(100, 50);<br> ctx.lineTo(150, 100);<br> ctx.lineTo(50, 100);<br> ctx.closePath();<br> ctx.fillStyle = '#4a90e2';<br> ctx.fill();<br> ctx.strokeStyle = '#2c3e50';<br> ctx.stroke();
动态生成正多边形(如雷达图骨架)
硬编码顶点不可扩展,推荐用数学方式生成顶点坐标:
- 确定中心点
(cx, cy)、半径r、边数n - 每个顶点角度为
angle = i * 2π / n + offset(i从 0 到n−1) - 用
x = cx + r * Math.cos(angle)、y = cy + r * Math.sin(angle)算坐标 - 循环中用
moveTo()(仅第一次)和lineTo()连接所有点,结尾closePath()
这样改边数只需换 n 值,无需重写路径逻辑,也便于做动画或响应式缩放。
注意像素对齐与路径复用陷阱
常见问题往往出在细节处理上:
-
线条发虚? 因为 Canvas 默认在像素边界中间绘制 1px 线,导致抗锯齿模糊。解决:把坐标偏移 0.5,如
moveTo(100.5, 50.5) -
fill() 不生效? 检查是否漏了
beginPath()或closePath();闭合路径不是自动的 -
restore() 不清路径? 正确:保存/恢复的是样式和变换状态,
beginPath()才真正重置路径 -
多个图形混叠? 每次绘制新图形前都应调用
beginPath(),否则新线会接在旧路径末尾
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










