filltext和stroketext是canvas 2d唯二原生文字绘制方法,必须显式设置font、fillstyle/strokestyle及textbaseline等属性,y坐标对应基线而非顶部,maxwidth仅缩放或截断文本,不自动换行。

fillText 和 strokeText 是 Canvas 2D 上下文里唯二能直接绘制文字的原生方法,没有替代品,也不能靠 CSS 控制。选错方法或漏设前置属性,文字就完全不出现——不是 bug,是设计如此。
fillText 绘制实心文字前必须设置 font 和 fillStyle
fillText 不会自动继承任何字体或颜色,它只管“按当前状态画”。常见错误是调用后页面空白,实际是因为 ctx.font 没设(默认值不可见)或 ctx.fillStyle 是透明色/无效值。
-
ctx.font必须是合法 CSS 字体字符串,比如"24px sans-serif"、"bold 16px 'Segoe UI'";写成"24px"或"Arial"单独出现会失效 -
ctx.fillStyle默认是"#000",但若之前被设为"transparent"、"rgba(0,0,0,0)"或无效字符串(如"none"),文字照样不可见 -
fillText(text, x, y)的y是基线位置,不是顶部。文字常“飘”在坐标点上方,这是正常行为,不是偏移错误
strokeText 绘制空心文字要配齐 strokeStyle + lineWidth
strokeText 看似只是描边,但它对样式更敏感:缺 strokeStyle 文字消失,lineWidth 过小(如 0.5)在高 DPI 屏上可能不可见,且描边默认居中于路径——而文字路径就是字体轮廓本身。
-
ctx.strokeStyle必须显式设置,不能依赖默认值;ctx.lineWidth默认是1.0,但在 Retina 屏上常需设为2才清晰 - 描边和填充可叠加:
strokeText后立刻fillText同一文本,能做出「白字黑边」效果,但注意两次调用的x/y必须完全一致 -
maxWidth参数在strokeText中同样生效:超宽时会缩放或截断,不是简单换行
maxWidth 参数的实际表现经常被误解
maxWidth 不是“最大宽度后自动换行”,而是“强制将文本压缩进该宽度内显示”。Canvas 没有自动折行机制,它只会等比缩小字体(如果浏览器支持)或截断超出部分。
- 传入
maxWidth后,文字可能变细、模糊,尤其在非整数缩放下;建议优先用measureText()预判宽度,再手动分段 - 中文、日文等 CJK 字体对
maxWidth响应不稳定,某些浏览器(如旧版 Safari)会直接忽略该参数 - 若想实现真实换行,必须自己切分字符串,逐行调用
fillText,并累加y值
最易被忽略的一点:Canvas 文字渲染严重依赖系统字体可用性。写 ctx.font = "20px 'PingFang SC'" 在 Windows 上必然失败,但控制台不会报错——它静默回退到默认字体,结果和预期完全不同。上线前务必在目标平台实测字体链。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











