可用arc()配合stroke()绘制空心圆环,或用内外同心圆路径+fill()实现填充环形,还可通过clip()裁剪或封装函数提升复用性,并需适配高DPI屏幕以保证清晰度。

如果您希望在网页中使用HTML5的Canvas元素绘制一个圆环,则需要利用Canvas 2D绘图上下文的arc()方法配合stroke()实现环形轮廓,或通过内外两个同心圆路径构造环形填充区域。以下是几种可行的绘制方法:
一、使用strokeStyle绘制空心圆环
该方法通过设置canvas画布的线条宽度和描边样式,在指定半径处绘制一条闭合的圆形路径,形成视觉上的圆环效果。关键在于将lineWidth设为所需环宽,并确保arc()的起始角与终止角构成完整圆周。
1、获取canvas元素并调用getContext('2d')获得2D绘图上下文。
2、设置context.lineWidth为圆环的粗细值,例如8。
立即学习“前端免费学习笔记(深入)”;
3、设置context.strokeStyle为圆环颜色,例如'#3498db'。
4、调用context.beginPath()开始新路径。
5、调用context.arc(x, y, radius, 0, Math.PI * 2)绘制完整圆弧,其中x、y为中心坐标,radius为圆心到环中线的距离。
6、调用context.stroke()渲染描边路径。
二、使用fill实现实心圆环(环形区域填充)
该方法通过构造两个同心圆路径——外圆逆时针、内圆顺时针——形成环状路径区域,再使用fill()填充中间区域,从而得到真正意义上的圆环形状,而非仅线条。
1、调用context.beginPath()启动路径。
2、使用context.arc(x, y, outerRadius, 0, Math.PI * 2, false)绘制外圆,方向为顺时针。
3、使用context.arc(x, y, innerRadius, 0, Math.PI * 2, true)绘制内圆,方向为逆时针(第三个参数设为true)。
4、调用context.closePath()闭合复合路径。
5、设置context.fillStyle为期望填充色,例如'#e74c3c'。
6、调用context.fill()完成环形区域着色。
三、使用clip裁剪出圆环区域
该方法先绘制一个大圆作为裁剪区域,再在其内部反向绘制小圆并使用clip()排除中心部分,最终在裁剪区域内执行填充操作,间接生成圆环。适用于需叠加复杂背景或纹理的场景。
1、调用context.beginPath()并绘制外圆路径:context.arc(x, y, outerRadius, 0, Math.PI * 2)。
2、调用context.clip()应用当前路径为裁剪区。
3、再次调用context.beginPath(),绘制内圆路径:context.arc(x, y, innerRadius, 0, Math.PI * 2)。
4、使用context.globalCompositeOperation = 'destination-out'设置合成模式为“目标减去源”。
5、调用context.fill()清除内圆区域。
6、重置合成模式:context.globalCompositeOperation = 'source-over'。
四、封装为可复用函数绘制圆环
将上述逻辑抽象为带参数的JavaScript函数,便于多次调用。函数接收圆心坐标、内外半径、颜色及是否描边等配置,提升代码可维护性与复用性。
1、定义函数drawRing(ctx, x, y, innerR, outerR, color, isStroke = false, lineWidth = 2)。
2、保存当前绘图状态:ctx.save()。
3、若isStroke为true,则配置lineWidth、strokeStyle并执行arc+stroke流程。
4、否则配置fillStyle,构建双圆路径并调用fill()。
5、恢复绘图状态:ctx.restore()。
五、适配高DPI屏幕绘制清晰圆环
在Retina屏或高分辨率设备上,Canvas默认以CSS像素渲染会导致图形模糊。需根据window.devicePixelRatio动态缩放canvas的width/height属性,并调整坐标系缩放比例,确保环形边缘锐利。
1、获取canvas DOM元素及其父容器尺寸。
2、读取window.devicePixelRatio值,记为dpr。
3、将canvas.width与canvas.height分别设为父容器宽高乘以dpr。
4、对context调用ctx.scale(dpr, dpr)进行坐标系缩放。
5、后续所有坐标参数(如x、y、radius)均按CSS像素传入,无需乘dpr。











