TextMetrics - 表示画布中一段文本的尺寸
TextMetrics 接口表示画布中一段文本的尺寸;可以使用 CanvasRenderingContext2D.measureText() 方法获得 TextMetrics 实例。
属性
TextMetrics.width 只读
一个 double,以 CSS 像素为单位,表示一段内联文本的计算宽度。它考虑了上下文的当前字体。
TextMetrics.actualBoundingBoxLeft 只读
一个 double,以 CSS 像素为单位,给出从 CanvasRenderingContext2D.textAlign 属性给定的对齐点到给定文本的边界矩形左侧的距离。该距离是平行于基线测量的。
TextMetrics.actualBoundingBoxRight 只读
一个 double,以 CSS 像素为单位,表示从 CanvasRenderingContext2D.textAlign 属性给出的对齐点到给定文本边界矩形右侧的距离。该距离是平行于基线测量的。
TextMetrics.fontBoundingBoxAscent 只读
一个 double,以 CSS 像素为单位,表示从 CanvasRenderingContext2D.textBaseline 属性指示的水平线到用于渲染文本的所有字体的最高边界矩形的顶部的距离。
TextMetrics.fontBoundingBoxDescent 只读
一个 double,以 CSS 像素为单位,表示从 CanvasRenderingContext2D.textBaseline 属性指示的水平线到用于渲染文本的所有字体的边界矩形的底部的距离。
TextMetrics.actualBoundingBoxAscent 只读
一个 double ,以 CSS 像素为单位,表示从 CanvasRenderingContext2D.textBaseline 属性指示的水平线到用于渲染文本的边界矩形顶部的距离。
TextMetrics.actualBoundingBoxDescent 只读
一个 double ,以 CSS 像素为单位,表示从 CanvasRenderingContext2D.textBaseline 属性指示的水平线到用于渲染文本的边界矩形底部的距离。
TextMetrics.emHeightAscent 只读
一个 double ,以 CSS 像素为单位,表示从 CanvasRenderingContext2D.textBaseline 属性指示的水平线到行框内 em 正方形顶部的距离。
TextMetrics.emHeightDescent 只读
一个 double ,以 CSS 像素表示从 CanvasRenderingContext2D.textBaseline 属性指示的水平线到行框中 em 正方形底部的距离。
TextMetrics.hangingBaseline 只读
一个 double ,以 CSS 像素为单位,表示从 CanvasRenderingContext2D.textBaseline 属性指示的水平线到线框的悬挂基线的距离。
TextMetrics.alphabeticBaseline 只读
一个 double ,以 CSS 像素为单位,表示从 CanvasRenderingContext2D.textBaseline 属性指示的水平线到线框的字母基线的距离。
TextMetrics.ideographicBaseline 只读
一个 double,以 CSS 像素表示从 CanvasRenderingContext2D.textBaseline 属性指示的水平线到线框的表意基线的距离。
实例
基线说明
该实例演示了 TextMetrics 对象的基线。默认基线是 alphabeticBaseline。另请参见 CanvasRenderingContext2D.textBaseline 属性。
HTML
<canvas id="canvas" width="550" height="500"></canvas>
<script>
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const baselinesAboveAlphabetic = ['fontBoundingBoxAscent', 'actualBoundingBoxAscent',
'emHeightAscent', 'hangingBaseline'];
const baselinesBelowAlphabetic = ['ideographicBaseline', 'emHeightDescent',
'actualBoundingBoxDescent', 'fontBoundingBoxDescent'];
const baselines = [...baselinesAboveAlphabetic, ...baselinesBelowAlphabetic];
ctx.font = '25px serif';
ctx.strokeStyle = 'red';
baselines.forEach(function (baseline, index) {
let text = 'Abcdefghijklmnop (' + baseline + ')';
let textMetrics = ctx.measureText(text);
let y = 50 + index * 50;
ctx.beginPath();
ctx.fillText(text, 0, y);
let lineY = y - Math.abs(textMetrics[baseline]);
if (baselinesBelowAlphabetic.includes(baseline)) {
lineY = y + Math.abs(textMetrics[baseline]);
}
ctx.moveTo(0, lineY);
ctx.lineTo(550, lineY);
ctx.stroke();
});
</script>
测量文字宽度
在测量文本的 x 方向时,由于字符的倾斜 / 斜体字体超出了行进宽度,因此 actualBoundingBoxLeft 和 actualBoundingBoxRight 之和可能比内联框的宽度(width)宽。
因此,使用 actualBoundingBoxLeft 和 actualBoundingBoxRight 之和作为获取绝对文本宽度的更准确方法可能很有用:
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const text = 'Abcdefghijklmnop';
ctx.font = 'italic 50px serif';
const textMetrics = ctx.measureText(text);
console.log(textMetrics.width);
// 459.8833312988281
console.log(Math.abs(textMetrics.actualBoundingBoxLeft) +
Math.abs(textMetrics.actualBoundingBoxRight));
// 462.8833333333333
规范
| 规范 |
|---|
| HTML Living Standard TextMetrics 的定义 |
桌面浏览器兼容性
| 特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|---|
| 基础支持 | 4 | 12 | 1.5 | 9 | 9 | 3.1 |
actualBoundingBoxAscent | 77 支持 — 77 | 79 | 74 | 不支持 | 未知 | 支持 |
actualBoundingBoxDescent | 77 支持 — 77 | 79 | 74 | 不支持 | 未知 | 支持 |
actualBoundingBoxLeft | 77 支持 — 77 | 79 | 74 | 不支持 | 未知 | 支持 |
actualBoundingBoxRight | 77 支持 — 77 | 79 | 74 | 不支持 | 未知 | 支持 |
alphabeticBaseline | 支持 | 79 | 74 | 不支持 | 未知 | 支持 |
emHeightAscent | 支持 | 79 | 74 | 不支持 | 未知 | 支持 |
emHeightDescent | 支持 | 79 | 74 | 不支持 | 未知 | 支持 |
fontBoundingBoxAscent | 支持 | 79 | 74 | 不支持 | 未知 | 支持 |
fontBoundingBoxDescent | 支持 | 79 | 74 | 不支持 | 未知 | 支持 |
hangingBaseline | 支持 | 79 | 74 | 不支持 | 未知 | 支持 |
ideographicBaseline | 支持 | 79 | 74 | 不支持 | 未知 | 支持 |
width | 4 | 12 | 1.5 | 9 | 9 | 3.1 |
移动浏览器兼容性
| 特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
|---|---|---|---|---|---|---|---|
| 基础支持 | 支持 | 支持 | 未知 | 31 | 未知 | 支持 | 支持 |
actualBoundingBoxAscent | 77 | 77 支持 — 77 | 未知 | 不支持 | 未知 | 未知 | 支持 |
actualBoundingBoxDescent | 77 | 77 支持 — 77 | 未知 | 不支持 | 未知 | 未知 | 支持 |
actualBoundingBoxLeft | 77 | 77 支持 — 77 | 未知 | 不支持 | 未知 | 未知 | 支持 |
actualBoundingBoxRight | 77 | 77 支持 — 77 | 未知 | 不支持 | 未知 | 未知 | 支持 |
alphabeticBaseline | 不支持 | 支持 | 未知 | 不支持 | 未知 | 未知 | 支持 |
emHeightAscent | 不支持 | 支持 | 未知 | 不支持 | 未知 | 未知 | 支持 |
emHeightDescent | 不支持 | 支持 | 未知 | 不支持 | 未知 | 未知 | 支持 |
fontBoundingBoxAscent | 不支持 | 支持 | 未知 | 不支持 | 未知 | 未知 | 支持 |
fontBoundingBoxDescent | 不支持 | 支持 | 未知 | 不支持 | 未知 | 未知 | 不支持 |
hangingBaseline | 不支持 | 支持 | 未知 | 不支持 | 未知 | 未知 | 支持 |
ideographicBaseline | 不支持 | 支持 | 未知 | 不支持 | 未知 | 未知 | 支持 |
width | 支持 | 支持 | 未知 | 31 | 未知 | 支持 | 3.2 |
相关链接
CanvasRenderingContext2D中的Creator方法<canvas>元素及其关联的接口HTMLCanvasElementHTMLCanvasElement