绘制文本

在上一章中,我们已经了解了如何在 应用样式和颜色,现在我们将看看如何在画布上绘制文本。

绘制文本

画布渲染上下文提供两种方法来渲染文本

fillText(text, x, y [, maxWidth])

使用当前 fillStyle 填充给定位置 (x,y) 的文本。可选地指定最大宽度进行绘制。

strokeText(text, x, y [, maxWidth])

使用当前 strokeStyle 描绘给定位置 (x,y) 的文本。可选地指定最大宽度进行绘制。

一个 fillText 示例

文本使用当前 fillStyle 进行填充。

js
function draw() {
  const ctx = document.getElementById("canvas").getContext("2d");
  ctx.font = "48px serif";
  ctx.fillText("Hello world", 10, 50);
}

一个 strokeText 示例

文本使用当前 strokeStyle 进行填充。

js
function draw() {
  const ctx = document.getElementById("canvas").getContext("2d");
  ctx.font = "48px serif";
  ctx.strokeText("Hello world", 10, 50);
}

文本样式

在上面的示例中,我们已经使用 font 属性使文本比默认大小略大。还有一些其他属性可以让你调整文本在画布上的显示方式

font = value

绘制文本时使用的当前文本样式。此字符串使用与 CSS font 属性相同的语法。默认字体为 10px sans-serif。

textAlign = value

文本对齐设置。可能的值:startendleftrightcenter。默认值为 start

textBaseline = value

基线对齐设置。可能的值:tophangingmiddlealphabeticideographicbottom。默认值为 alphabetic

direction = value

方向性。可能的值:ltrrtlinherit。默认值为 inherit

如果你之前使用过 CSS,这些属性可能对你来说很熟悉。

来自 WHATWG 的以下图表演示了 textBaseline 属性支持的各种基线。 em 方格的顶部大致位于字体中字形的顶部,悬挂基线是像 आ 这样的某些字形锚定的位置,中间是 em 方格顶部和底部之间的一半,字母基线是像 Á、ÿ、f 和 Ω 这样的字符锚定的位置,表意基线是像 私 和 達 这样的字形锚定的位置,em 方格的底部大致位于字体中字形的底部。由于字形扩展到 em 方格之外,边界框的顶部和底部可能会远离这些基线。

一个 textBaseline 示例

编辑下面的代码,并在画布中实时查看更改的更新

高级文本测量

如果需要获取有关文本的更多详细信息,可以使用以下方法进行测量。

measureText()

返回一个 TextMetrics 对象,其中包含指定文本在当前文本样式下绘制时的宽度(以像素为单位)。

以下代码片段显示了如何测量文本并获取其宽度。

js
function draw() {
  const ctx = document.getElementById("canvas").getContext("2d");
  const text = ctx.measureText("foo"); // TextMetrics object
  text.width; // 16;
}

无障碍问题

<canvas> 元素只是一个位图,不提供有关任何绘制对象的任何信息。在画布上编写的文本会导致依赖屏幕放大的用户出现可读性问题。画布元素内的像素不会缩放,并且在放大时可能会变得模糊。这是因为它们不是矢量,而是字母形状的像素集合。当放大它时,像素会变得更大。

画布内容不会公开给像语义化 HTML 这样的无障碍工具。一般来说,你应该避免在无障碍网站或应用程序中使用画布。可以使用 HTML 元素或 SVG 来代替画布。