TextMetrics
Базовая линия Широко поддерживается *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
* Некоторые части этой функции могут иметь различный уровень поддержки.
Примечание: Эта функция доступна в Потоках веб-работы.
Интерфейс TextMetrics представляет собой размеры фрагмента текста на холсте; экземпляр TextMetrics можно получить с помощью метода CanvasRenderingContext2D.measureText().
Свойства экземпляра
-
TextMetrics.widthТолько для чтения -
Возвращает ширину фрагмента инлайнового текста в пикселях CSS. Учитывает текущий шрифт контекста.
-
TextMetrics.actualBoundingBoxLeftТолько для чтения -
Расстояние параллельно базовой линии от точки выравнивания, заданной свойством
CanvasRenderingContext2D.textAlign, до левой стороны ограничивающего прямоугольника данного текста в пикселях CSS; положительные значения указывают на расстояние влево от заданной точки выравнивания. -
TextMetrics.actualBoundingBoxRightТолько для чтения -
Возвращает расстояние от точки выравнивания, заданной свойством
CanvasRenderingContext2D.textAlign, до правой стороны ограничивающего прямоугольника данного текста в пикселях CSS. Расстояние измеряется параллельно базовой линии. -
TextMetrics.fontBoundingBoxAscentТолько для чтения -
Возвращает расстояние от горизонтальной линии, указанной атрибутом
CanvasRenderingContext2D.textBaseline, до верхней части самого большого ограничивающего прямоугольника всех шрифтов, используемых для рендеринга текста, в пикселях CSS. -
TextMetrics.fontBoundingBoxDescentТолько для чтения -
Возвращает расстояние от горизонтальной линии, указанной атрибутом
CanvasRenderingContext2D.textBaseline, до нижней части ограничивающего прямоугольника всех шрифтов, используемых для рендеринга текста, в пикселях CSS. -
TextMetrics.actualBoundingBoxAscentТолько для чтения -
Возвращает расстояние от горизонтальной линии, указанной атрибутом
CanvasRenderingContext2D.textBaseline, до верхней части ограничивающего прямоугольника, используемого для рендеринга текста, в пикселях CSS. -
TextMetrics.actualBoundingBoxDescentТолько для чтения -
Возвращает расстояние от горизонтальной линии, указанной атрибутом
CanvasRenderingContext2D.textBaseline, до нижней части ограничивающего прямоугольника, используемого для рендеринга текста, в пикселях CSS. -
TextMetrics.emHeightAscentТолько для чтения -
Возвращает расстояние от горизонтальной линии, указанной свойством
CanvasRenderingContext2D.textBaseline, до верхней части квадрата em в блоке строки в пикселях CSS. -
TextMetrics.emHeightDescentТолько для чтения -
Возвращает расстояние от горизонтальной линии, указанной свойством
CanvasRenderingContext2D.textBaseline, до нижней части квадрата em в блоке строки в пикселях CSS. -
TextMetrics.hangingBaselineТолько для чтения -
Возвращает расстояние от горизонтальной линии, указанной свойством
CanvasRenderingContext2D.textBaseline, до висящей базовой линии блока строки в пикселях CSS. -
TextMetrics.alphabeticBaselineТолько для чтения -
Возвращает расстояние от горизонтальной линии, указанной свойством
CanvasRenderingContext2D.textBaseline, до алфавитной базовой линии блока строки в пикселях CSS. -
TextMetrics.ideographicBaselineТолько для чтения -
Возвращает расстояние от горизонтальной линии, указанной свойством
CanvasRenderingContext2D.textBaseline, до иероглифической базовой линии блока строки в пикселях CSS.
Примеры
Базовые линии
Этот пример демонстрирует базовые линии, которые содержит объект TextMetrics. Базовая линия по умолчанию — alphabeticBaseline. См. также свойство CanvasRenderingContext2D.textBaseline.
HTML
<canvas id="canvas" width="550" height="500"></canvas>
JavaScript
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((baseline, index) => {
const text = `Abcdefghijklmnop (${baseline})`;
const textMetrics = ctx.measureText(text);
const y = 50 + index * 50;
ctx.beginPath();
ctx.fillText(text, 0, y);
const baselineMetricValue = textMetrics[baseline];
if (baselineMetricValue === undefined) {
return;
}
const lineY = baselinesBelowAlphabetic.includes(baseline)
? y + Math.abs(baselineMetricValue)
: y - Math.abs(baselineMetricValue);
ctx.moveTo(0, lineY);
ctx.lineTo(550, lineY);
ctx.stroke();
});
Результат
Измерение ширины текста
При измерении направления 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(
textMetrics.actualBoundingBoxRight + textMetrics.actualBoundingBoxLeft,
);
// 462.8833333333333
Спецификации
| Спецификация |
|---|
| HTML # textmetrics |
Совместимость с браузерами
| Рабочий стол | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
TextMetrics |
2 | 12 | 1.5 | 9 | 4 | 18 | 31 | 10.1 | 3.2 | 1.0 | ≤37 |
actualBoundingBoxAscent |
77 | 79 | 74 | 64 | 11.1 | 77 | 79 | 55 | 11.3 | 12.0 | 77 |
actualBoundingBoxDescent |
77 | 79 | 74 | 64 | 11.1 | 77 | 79 | 55 | 11.3 | 12.0 | 77 |
actualBoundingBoxLeft |
77 | 79 | 74 | 64 | 11.1 | 77 | 79 | 55 | 11.3 | 12.0 | 77 |
actualBoundingBoxRight |
77 | 79 | 74 | 64 | 11.1 | 77 | 79 | 55 | 11.3 | 12.0 | 77 |
alphabeticBaseline |
118 | 118 | 116 | 104 | 11.1 | 118 | 116 | 79 | 11.3 | 25.0 | 118 |
emHeightAscent |
77 | 79 | 118 | 64 | 11.1 | 77 | 118 | Нет | 11.3 | Нет | Нет |
emHeightDescent |
77 | 79 | 118 | 64 | 11.1 | 77 | 118 | Нет | 11.3 | Нет | Нет |
fontBoundingBoxAscent |
87 | 87 | 116 | 73 | 11.1 | 87 | 116 | 62 | 11.3 | 14.0 | 87 |
fontBoundingBoxDescent |
87 | 87 | 116 | 73 | 11.1 | 87 | 116 | 62 | 11.3 | 14.0 | 87 |
hangingBaseline |
118 | 118 | 116 | 104 | 11.1 | 118 | 116 | 79 | 11.3 | 25.0 | 118 |
ideographicBaseline |
118 | 118 | 116 | 104 | 11.1 | 118 | 116 | 79 | 11.3 | 25.0 | 118 |
width |
2 | 12 | 1.5 | 9 | 4 | 18 | 31 | 10.1 | 3.2 | 1.0 | 4.4 |
См. также
- Метод Creator в
CanvasRenderingContext2D - Элемент
<canvas>и связанный интерфейсHTMLCanvasElement
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics