SVG.js предоставляет удобные методы для работы с элементами текста, включая динамическое измерение их размеров. Измерение текста необходимо при позиционировании, обрезке или выравнивании элементов на канвасе.
Классический способ получения размеров текста в SVG.js —
использование метода bbox(). Этот метод возвращает объект с
координатами и размерами ограничивающего прямоугольника
(Bounding Box).
const draw = SVG().addTo('body').size(600, 400);
const text = draw.text('Пример текста').font({ size: 24, family: 'Arial' });
const bbox = text.bbox();
console.log(bbox.width, bbox.height);
bbox() возвращает объект со следующими ключевыми
свойствами:
x — координата X верхнего левого угла;y — координата Y верхнего левого угла;width — ширина текста;height — высота текста;cx, cy — координаты центра текста.Размеры текста напрямую зависят от параметров шрифта:
text.font({ size: 30, family: 'Times New Roman', weight: 'bold' });
Изменение size, family, weight
и style может кардинально изменить bbox(). Для
точного позиционирования необходимо измерять текст после применения всех
параметров шрифта.
SVG.js позволяет создавать многострочные элементы текста через
tspan. Каждый tspan может иметь свои размеры,
поэтому для корректного измерения нужно учитывать все линии:
const multiLineText = draw.text(add => {
add.tspan('Первая строка').newLine();
add.tspan('Вторая строка').newLine();
}).font({ size: 20 });
const multiBbox = multiLineText.bbox();
console.log(multiBbox.width, multiBbox.height);
bbox() учитывает все строки, возвращая размеры всего
блока текста.
Иногда необходимо вычислить размеры текста перед добавлением на канвас для корректного выравнивания. Для этого можно создать временный элемент, измерить его и удалить:
const tempText = draw.text('Временный текст').font({ size: 18 }).opacity(0);
const tempBbox = tempText.bbox();
tempText.remove();
Этот подход позволяет заранее рассчитать ширину и высоту без визуального отображения текста.
Методы bbox() и rbox() различаются по
контексту координат:
bbox() — размеры в локальных координатах элемента;rbox() — размеры с учётом трансформаций и родительских
контейнеров.text.rotate(45);
const localBbox = text.bbox();
const transformedBbox = text.rbox();
rbox() полезен при сложных трансформациях, например, при
масштабировании, поворотах или вложенных группах.
Измерение текста необходимо для:
bbox().width и bbox().height.const container = draw.rect(200, 50).fill('#eee');
const label = draw.text('Динамический текст').font({ size: 16 });
const labelBbox = label.bbox();
label.center(container.cx(), container.cy());
Точная работа с текстом требует понимания baseline.
SVG.js учитывает базовую линию по умолчанию, но при необходимости можно
применять смещение через dy или
dominant-baseline:
text.attr({ 'dominant-baseline': 'middle' });
text.tspan('Смещение').dy(5);
Это особенно важно при сложной верстке многострочного текста и при выравнивании с графическими элементами.
bbox() — локальные размеры текста;rbox() — размеры с учетом трансформаций;Эти инструменты обеспечивают полный контроль над размерами и расположением текста в SVG.js, позволяя создавать адаптивные и точно выверенные графические интерфейсы.