是,必须调用 beginPath();arc() 仅定义路径,需配合 beginPath() 隔离路径状态、fill() 或 stroke() 渲染,且 startAngle/endAngle 单位为弧度,整圆应传 0 和 2*Math.PI。
不强制,但漏掉 beginPath() 是绝大多数“画不出圆”或“圆连着上一条线”的根源。canvas 的路径是累积的——如果你之前画过线、矩形或别的弧,arc() 会把新圆弧接到旧路径末尾,形成意外连线。
实操建议:
ctx.beginPath()
fill() 却发现整个 canvas 被填满,大概率是没 beginPath() 导致路径闭合异常因为 arc() 的角度单位是弧度,不是度数。写 arc(100, 100, 50, 0, 360, false) 实际画的是从 0 弧度到 360 弧度(≈204°),根本不是一圈——而 2 * Math.PI 才等于完整圆周的弧度值(≈6.283)。
常见错误现象:
立即学习“前端免费学习笔记(深入)”;
0 和 359 这类近似值)0 和 720 这类大整数)Math.PI / 180 * 90 换算但忘了括号,导致运算顺序错)正确写法就两个:画整圆用 0 和 2 * Math.PI;画半圆用 0 和 Math.PI 或 Math.PI 和 2 * Math.PI,取决于方向。
这不是 arc() 的锅,而是 canvas 像素对齐和抗锯齿机制在起作用。尤其当圆心坐标带小数(如 100.5, 100.5)时,浏览器会尝试在两个像素间插值,结果就是模糊。
解决办法很直接:
x、y 是整数,比如 100 而不是 100.3
ctx.imageSmoothingEnabled = false(仅影响后续 drawImage,对 arc 无效)window.devicePixelRatio 缩放 canvas 的 width/height 属性,并用 CSS 控制显示尺寸例如高 DPI 下画清晰圆:
const canvas = document.getElementById('myCanvas');const ctx = canvas.getContext('2d');const dpr = window.devicePixelRatio || 1;canvas.width = 200 * dpr;canvas.height = 200 * dpr;canvas.style.width = '200px';canvas.style.height = '200px';ctx.scale(dpr, dpr);ctx.arc(100, 100, 50, 0, 2 * Math.PI); // 此时坐标仍写逻辑像素值ctx.stroke();
arc() 只定义路径,不渲染。漏掉 stroke() 或 fill() 是新手最常卡住的地方;但还有几个隐蔽原因:
ctx.strokeStyle 或 ctx.fillStyle,默认值可能是透明色(rgba(0,0,0,0))0 或负数:浏览器静默忽略,不报错也不画arc(-100, -100, 10, ...))fill() 但路径没闭合——arc() 本身不自动闭合,所以填充整圆没问题,但填充扇形必须手动 closePath() 或用 lineTo() 回圆心验证是否真没画出来:临时加一句 console.log(ctx.canvas.toDataURL()) 看 base64 数据是否存在变化。
实际项目里最容易被忽略的,是把 arc() 当成“立刻画圆”的命令——它只是路径指令,中间任何一步断链(beginPath()、角度单位、样式设置、绘制触发)都会让圆消失得毫无征兆。