Всё о шрифтах в SVG: от основ до лайфхаков
Содержание
- Основные подходы к работе с текстом в SVG
- Основы текста в SVG: элементы <text> и <tspan>
- Ключевые атрибуты для стилизации текста
- Подключение веб-шрифтов к SVG
- SVG внутри тега <img> и ограничения безопасности
- Оптимизация, доступность и градиенты
- Конвертация текста в кривые
- Создание иконки с текстом для сайта
- Заключение
SVG fonts — это первое, о чём многие думают, когда слышат о тексте в векторной графике, однако здесь кроется фундаментальное недопонимание.
В контексте современного веба под этим запросом чаще всего подразумевают не отдельный формат шрифта (как, например, TrueType или WOFF), а способы корректного отображения текстовых элементов внутри SVG-документов и методы решения связанных с этим проблем. Это касается как встраивания векторной графики с текстом на HTML-страницы, так и использования SVG-файлов в качестве иконок или иллюстраций. Понимание этой разницы — ключ к эффективной работе.
Основные подходы к работе с текстом в SVG
@font-face для отрисовки текста в HTML, текст внутри SVG может вести себя иначе.SVG — это автономный XML-документ, который может либо включать описание глифов шрифта внутри себя (что сейчас практически не используется), либо ссылаться на внешние ресурсы, либо рассчитывать на наличие шрифта в системе пользователя. Основная сложность и фокус внимания разработчиков лежит в области обеспечения переносимости и стабильного отображения такого текста в различных браузерах и на разных устройствах.
Методы работы с SVG fonts
- Системные шрифты: надежность, но отсутствие гарантий единообразия.
- Веб-шрифты, подключенные через CSS: единый стиль, но сложности с встраиванием.
- Конвертация текста в кривые (path): абсолютная стабильность, но потеря возможности редактирования и семантики.
Давайте детально разберем каждый аспект, начиная с основ.
Основы текста в SVG: элементы <text> и <tspan>
Основы работы с текстом в SVG закладываются двумя главными XML-элементами: <text> и <tspan>. Элемент <text> создает текстовый блок, а <tspan> позволяет форматировать его фрагменты внутри этого блока, аналогично тому, как тег <span> работает в HTML. С их помощью вы можете не только выводить строки, но и позиционировать их с точностью до пикселя, что является мощным преимуществом векторной графики.
Текст в SVG позиционируется с помощью атрибутов x и y, которые задают координаты базовой линии первой буквы. Это важное отличие от позиционирования блочных HTML-элементов, где координаты обычно относятся к верхнему левому углу. Для многострочного текста исторически использовался элемент <tspan> с атрибутом dy (сдвиг по вертикали), хотя в современном SVG также доступен более семантичный элемент <textArea> (но его поддержка пока менее стабильна).
Ключевые атрибуты для стилизации текста
font-family: определяет семейство шрифта (например, ‘Roboto’, sans-serif).font-size: размер шрифта. Может задаваться в пикселях (px), относительных единицах (em) или пользовательских единицах SVG.font-weight: насыщенность шрифта (normal,bold,700).fill: цвет заливки текста. Может быть цветовым словом, HEX, RGB или градиентом.stroke: цвет обводки контуров букв.text-anchor: выравнивание текста относительно заданной точки (start,middle,end).
Пример 1
Использование текста в SVG.
<svg width="280" height="150">
<text x="20" y="40" font-family="Arial" font-size="24" fill="navy">
Простой текст в SVG
</text>
<text x="20" y="80" font-family="Georgia" font-size="20" fill="black">
Это начало предложения,
<tspan dy="25" x="20" font-weight="bold" fill="red">а это — выделенный</tspan>
<tspan dy="25" x="20" font-style="italic">фрагмент.</tspan>
</text>
</svg>
Подключение веб-шрифтов к SVG
Если SVG инлайново вставлен в HTML-документ (<svg> прямо в коде страницы), то он может использовать те же шрифты, что и весь сайт, подключенные через глобальный CSS. Однако, если SVG используется как отдельный файл (через <img>, <object> или как background-image в CSS), он становится автономным «островком», и ему необходимо иметь объявление шрифта внутри себя.
Самый надежный и рекомендуемый способ — встраивание правил @font-face непосредственно внутрь SVG-файла с помощью тега <style>, который обычно помещается в секцию <defs> (определения). Это гарантирует, что браузер загрузит указанный шрифт при отрисовке графики, независимо от её окружения.
Сравнение методов подключения шрифтов
| Метод | Как работает | Плюсы | Минусы | Идеально для |
|---|---|---|---|---|
| Внешний CSS (HTML) | SVG встроен в HTML, шрифт объявлен в CSS страницы. | Централизованное управление. | Не работает для SVG в теге <img>. | Интерактивные SVG на странице. |
| Внутренний <style> | Правило @font-face встроено в SVG-файл. | Переносимость, работает в <img>. | Увеличивает размер файла, дублирование шрифта. | Отдельные SVG-файлы, иконки. |
| Системные шрифты | Указание font-family: Arial, sans-serif;. |
Максимальная скорость, нет запросов. | Нет контроля, разное отображение на разных ОС. | Простая, нефирменная графика. |
Пример 2
SVG с внутренним подключением веб-шрифта.
<svg xmlns="http://www.w3.org/2000/svg" width="600" height="200">
<defs>
<style>
@font-face {
font-family: 'MyWebFont';
src: url('https://example.com/fonts/webfont.woff2') format('woff2');
}
</style>
</defs>
<text x="20" y="50" font-family="'MyWebFont', sans-serif" font-size="32">
Текст с кастомным веб-шрифтом
</text>
</svg>
Важный нюанс: при использовании SVG в качестве background-image в CSS, правила @font-face из внешнего CSS страницы не будут применены. В этом случае единственным рабочим решением является встраивание шрифта внутрь SVG или конвертация текста в кривые.
Собери свой код. Запусти сайт!
От наброска на салфетке до первого работающего лендинга. Наш онлайн-курс «Веб-верстка с нуля и до профессионала» — это интенсивный трек, где ты не будешь зубрить теорию, а с первого дня начнешь превращать идеи в чистый HTML и CSS.
Собери свой первый проект под руководством практикующих разработчиков.
SVG внутри тега <img> и ограничения безопасности
<img> заключается в политике безопасности браузеров, которая трактует такие файлы как "независимые документы".Браузер намеренно ограничивает их возможности, блокируя доступ к внешним ресурсам, включая шрифты, загружаемые по ссылке в правиле @font-face. Это означает, что если ваш SVG, используемый как <img src='logo.svg'>, ссылается на шрифт через url('https://...'), этот шрифт почти наверняка не загрузится, и браузер откатится к резервному семейству (часто serif), испортив дизайн.
Обходные пути и решения
1. Встраивание шрифта в Base64
Самый надежный способ. Шрифт конвертируется в строку в формате base64 и вставляется прямо в правило src внутри @font-face. Это делает SVG полностью автономным.
Пример 3
Встраивание шрифта в Base64.
<style>
@font-face {
font-family: 'EmbeddedFont';
src: url(data:application/font-woff2;charset=utf-8;base64,d09GRgABAAAAA...) format('woff2');
}
</style>
- Плюсы: 100% работоспособность в <img>, <object>, CSS
background-image. - Минусы: значительное увеличение размера SVG-файла (примерно на 30-35%).
2. Использование <object> вместо <img>
<object data="logo.svg" type="image/svg+xml"></object> загружает SVG как отдельный документ, в котором внешние ресурсы (при соблюдении CORS) могут быть разрешены. Это позволяет использовать внешние ссылки на шрифты.
- Плюсы: чистота кода, разделение ресурсов.
- Минусы: более сложная логика взаимодействия (стилизация извне, скрипты), чуть менее привычная семантика.
3. Конвертация текста в кривые (paths)
Радикальное, но абсолютно надежное решение. Текст в графическом редакторе (Illustrator, Figma, Inkscape) преобразуется в векторные контуры (<path<). Шрифт больше не нужен.
- Плюсы: гарантированное, идентичное отображение везде.
- Минусы: текст нельзя выделить, скопировать, изменить через код; размер файла для сложных шрифтов может вырасти.
Оптимизация, доступность и градиенты
1. Оптимизация SVG со встроенными шрифтами
Если вы пошли по пути встраивания Base64, файл может стать огромным. Используйте инструменты для оптимизации:
- Субсеттинг шрифта: включайте в файл только те символы (глифы), которые используются в конкретном SVG. Онлайн-сервисы (например, (откроется в новой вкладке)Font Subsetter) или локальные утилиты (pyftsubset из fonttools) позволяют это сделать.
- Оптимизация SVG: пропускайте итоговый файл через (откроется в новой вкладке)SVGO (SVG Optimizer). Он, среди прочего, может сжимать Base64-строки.
2. Доступность (a11y)
Текст в SVG должен оставаться доступным для скринридеров и поисковиков.
- Всегда используйте элемент
<text>, а не конвертируйте всё в<path>, если это возможно. - Добавляйте атрибут
aria-labelили<title>и<desc>для описания графики в целом.
Пример 4
Использование атрибутов aria-labeledby и title.
<svg aria-labelledby="title1">
<title id="title1">Логотип компании Веб-Студия</title>
<text x="10" y="50">Веб-Студия</text>
</svg>
3. Текст с градиентом и обводкой
Пример 5
Создаем сложные эффекты, недоступные для обычного HTML-текста.
<defs>
<linearGradient id="textGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#ff0000" />
<stop offset="100%" stop-color="#0000ff" />
</linearGradient>
</defs>
<text x="20" y="70" font-size="40" font-weight="bold"
fill="url(#textGradient)"
stroke="#333" stroke-width="1">
Радужный текст
</text>
4. Эмуляция text-overflow: ellipsis
В SVG нет встроенного свойства для обрезки текста многоточием, но его можно сэмулировать с помощью JavaScript (для интерактивных SVG) или вручную на этапе разработки, вычисляя длину строки.
Конвертация текста в кривые
Конвертация текста в кривые — это крайняя, но часто необходимая мера, которая превращает каждый символ в набор векторных контуров (<path>). Этот процесс лишает текст его «текстовой» природы: его нельзя выделить курсором, скопировать как текст, изменить шрифт или размер через CSS, а также проиндексировать поисковыми системами. Однако именно это делает отображение абсолютно независимым от наличия шрифтов у конечного пользователя.
Когда это необходимо
- Логотипы и статичные элементы брендинга, где пиксель-перфект точность критична.
- Сложные декоративные шрифты, которые маловероятно есть на большинстве устройств и которые слишком «тяжелы» для веб-встраивания.
- Графика, предназначенная для печати в высоком разрешении, где недопустима подмена шрифта.
- Иконки с текстовыми элементами, которые используются в виде спрайтов или фоновых изображений.
Как правильно конвертировать
- В графическом редакторе (Adobe Illustrator, Figma, Inkscape) выделите текстовый объект.
- Выполните команду Convert to Outlines (или Create Outlines).
- ВАЖНЫЙ ЛАЙФХАК: перед конвертацией обязательно создайте копию исходного текстового слоя и скройте его. Это позволит вам в будущем внести правки, не набирая текст заново и не подбирая шрифт.
- Экспортируйте SVG. Вы увидите, что вместо тегов
<text>файл содержит сложные пути<path d="M100 200 L150 250...">.
Пример 6
Текст до и после конвертации.
<!-- До конвертации -->
<text x="20" y="40" font-family="MyLogoFont">Лого</text>
<!-- После конвертации в пути -->
<path d="M20,40 l10,5 c5,5 10,0 15,-5 ..." fill="black"/>
<path d="M50,40 l5,10 ..." fill="black"/>
Помните: после этой операции файл редактируется только как векторная форма. Для внесения текстовых правок нужно возвращаться к сохраненной копии в редакторе.
Создание иконки с текстом для сайта
Рассмотрим практический кейс создания иконки с текстом для сайта, где требуется, чтобы иконка отображалась одинаково во всех браузерах и могла использоваться различными способами.
Задача
Создать SVG-бейдж «Новинка» с использованием кастомного шрифта.
1. Дизайн в редакторе
Создаем композицию в Figma/Illustrator: закругленный прямоугольник и надпись NEW внутри него.
2. Выбор стратегии
Так как это маленькая статичная иконка, которую будут использовать как <img> и возможно как background-image, оптимальный путь — встраивание субсеттинга шрифта в Base64 или конвертация в кривые. Для примера выберем встраивание.
3. Подготовка шрифта
- Берем файл шрифта
.woff2. - Генерируем субсетт, оставив только символы:
N,E,W. Это сократит размер в разы. - Конвертируем полученный мини-файл в
Base64(используем онлайн-конвертер или скрипт).
4. Сборка SVG
Пример 7
Итоговая иконка с текстом.
<svg xmlns="http://www.w3.org/2000/svg" width="80" height="30" viewBox="0 0 80 30">
<defs>
<style>
/* Встраиваем только нужные глифы шрифта */
@font-face {
font-family: 'BadgeFont';
src: url(data:font/woff2;base64,d09GMgABAAAAAADwAA8AAAAAAbwAAJ...) format('woff2');
font-weight: bold;
}
.badge-bg { fill: #ff4757; rx: 5px; }
.badge-text {
font-family: 'BadgeFont', sans-serif;
font-size: 14px;
font-weight: bold;
fill: white;
text-anchor: middle;
}
</style>
</defs>
<!-- Фон бейджа -->
<rect class="badge-bg" width="80" height="30"/>
<!-- Текст, идеально выровненный по центру -->
<text class="badge-text" x="40" y="20">NEW</text>
</svg>
5. Финишная оптимизация
Прогоняем финальный код через SVGO, чтобы удалить лишние пробелы и комментарии.
6. Использование
Теперь этот SVG можно безопасно вставлять через <img src="badge.svg">, использовать в CSS как background: url(badge.svg) или инлайново в HTML. Шрифт гарантированно «уедет» вместе с файлом.
Заключение
Работа с текстом в SVG требует комплексного подхода, где нет единственного правильного ответа для всех ситуаций. Выбор метода зависит от конкретной задачи: является ли SVG частью живой страницы или самостоятельным файлом, критична ли доступность текста, насколько важен контроль над отображением. Ключ к успеху — понимание внутренней кухни формата и ограничений, накладываемых браузерами.
Подведем итоги
- Для интерактивных SVG, встроенных прямо в HTML, смело используйте веб-шрифты, подключенные через общий CSS сайта.
- Для отдельных файлов SVG (иконки, бейджи, статичные иллюстрации), которые будут вставляться через
<img>, единственные надежные варианты — это встраивание шрифта вBase64или конвертация текста в кривые. - Конвертация в
<path>— это «атомная бомба», которая решает все проблемы с отображением, но убивает семантику и доступность. Используйте её осознанно. - Не забывайте про оптимизацию (субсеттинг шрифтов, SVGO) и доступность (
<title>,<desc>).
Создавать современные сайты с безупречной графикой и интерфейсами — сложно. Онлайн-курс по современной верстке от нашей студии научит вас мыслить как фронтенд-профессионал и глубоко понимать технологии. А если нужен готовый результат — мы разработаем для вас мощный и продающий сайт, который привлечет клиентов и поддержит рост бизнеса.