Главная Статьи Оптимизация

Веб-шрифты и скорость

Красивый фирменный шрифт — это здорово, но за него платят скоростью. Шрифт — это файл, который надо скачать, и пока он грузится, текст либо не виден, либо мигает, подменяясь на лету. На медленном интернете это особенно заметно. Хорошая новость: шрифт можно подключить так, чтобы он почти не вредил. Разберём как.

В чём проблема

Когда страница использует нестандартный шрифт, браузеру нужно скачать его файл. Пока файл не пришёл, возможны два неприятных сценария: либо текст вообще не показывается (пустое место там, где должны быть слова — «мерцание невидимого текста»), либо сначала рисуется системным шрифтом, а потом резко перерисовывается вашим — и страница дёргается. Оба варианта раздражают и портят впечатление, а второй ещё и ухудшает показатель сдвигов CLS.

Что видит пользователь, пока грузится шрифт ✗ Без swap (FOIT) пусто — текст невидим, пока ждём шрифт ✓ С font-display: swap текст виден сразу, шрифт подменится позже
Со swap читать можно мгновенно — фирменный шрифт «доезжает» без пустого экрана.

Главное — font-display: swap

Самое важное правило одной строкой. Свойство font-display: swap говорит браузеру: «не прячь текст — покажи его сразу системным шрифтом, а когда мой загрузится, подмени». В результате человек начинает читать мгновенно, а фирменный шрифт подхватывается чуть позже, без пустого экрана.

@font-face {
  font-family: "MyFont";
  src: url("myfont.woff2") format("woff2");
  font-display: swap;
}

Что ещё ускоряет шрифты

📦 Формат woff2
Современный сжатый формат шрифтов — заметно легче старых ttf/otf. Используйте woff2, его понимают все актуальные браузеры.
🔤 Только нужные символы
Подмножество (subset) — оставить в файле лишь кириллицу и латиницу, выбросив иероглифы и редкие знаки. Файл худеет в разы.
⚖️ Меньше начертаний
Каждое начертание (тонкое, обычное, жирное, курсив) — отдельный файл. Подключайте только те, что реально используете.
⚡ Preload ключевого
Основной шрифт можно предзагрузить, чтобы он пришёл раньше и текст не мерцал.

Свой сервер или внешний

Шрифты можно подключать с внешнего сервиса или хранить у себя. Сегодня чаще советуют хранить у себя (self-host): это убирает лишнее соединение со сторонним доменом, даёт полный контроль над кэшированием и не зависит от доступности чужого сервиса. Если всё же используете внешний источник — добавьте к его домену preconnect, чтобы сэкономить время на соединение.

💡 Самый быстрый шрифт — тот, который не нужно грузить. Системные шрифты (те, что уже стоят на устройстве) подключаются мгновенно и выглядят аккуратно. Если фирменный шрифт не принципиален, системный набор — отличный вариант без единого килобайта загрузки.
Шрифты — часть общей скорости вместе с критическим CSS, ленивой загрузкой картинок и сжатием. Как это отражается на метриках — Core Web Vitals.

FOIT и FOUT: два сценария

У этих двух неприятностей есть названия, которые полезно знать. FOIT (Flash of Invisible Text — вспышка невидимого текста) — это когда браузер прячет текст, пока грузится шрифт: на месте слов пустота, человек ждёт и ничего не читает. FOUT (Flash of Unstyled Text — вспышка нестилизованного текста) — когда текст сразу показывается запасным шрифтом, а потом подменяется фирменным, из-за чего на миг «дёргается». Из двух зол FOUT лучше: читать можно сразу. Свойство font-display: swap как раз выбирает поведение FOUT — показать резервный шрифт немедленно. Поэтому swap и считается правильным значением по умолчанию.

Subsetting: оставить только нужное

Шрифт обычно содержит тысячи символов на десятки языков, а вашему сайту нужны лишь кириллица, латиница и базовые знаки. Subsetting (создание подмножества) выбрасывает всё лишнее — иероглифы, редкие алфавиты, спецсимволы — и файл худеет в разы. Делать это можно специальными инструментами, которые пересобирают шрифт под нужный набор. Технически за выбор символов отвечает свойство unicode-range: можно даже разбить шрифт на части и грузить кириллический поднабор отдельно от латинского, чтобы браузер качал только то, что реально встречается на странице. Для русскоязычного сайта грамотный subset — один из самых жирных способов облегчить шрифты.

Сколько шрифтов разумно

Каждый шрифт и каждое начертание — отдельный файл и отдельная загрузка, поэтому жадничать не стоит. Разумный максимум для большинства сайтов — одно-два семейства: например, одно для заголовков, одно для текста, а лучше и вовсе одно на всё. Внутри семейства подключайте только реально используемые начертания: обычное и полужирное покрывают почти все нужды, а тонкие, сверхжирные и экзотические курсивы чаще лежат мёртвым грузом. Важный нюанс: если не подключить настоящий жирный или курсив, браузер «подделает» его, искусственно утолщив или наклонив обычный, — выглядит это коряво. Лучше подключить нужное начертание, чем плодить десяток на всякий случай.

Системный стек шрифтов

Если фирменный шрифт не принципиален, есть бесплатный по скорости вариант — системный стек. Это набор шрифтов, уже установленных в операционных системах: вы перечисляете их в CSS, и браузер берёт «родной» шрифт устройства. На Mac это будет один шрифт, на Windows другой, на Android третий — но все они аккуратные, привычные пользователю и грузятся мгновенно, потому что качать нечего. Многие крупные сайты и интерфейсы сознательно используют системный стек ради скорости и нативного вида. Если бренд не завязан на конкретную гарнитуру, это сильное и недооценённое решение.

Коротко

Веб-шрифты тормозят показ текста: пока файл грузится, текст либо не виден, либо мерцает при подмене. Главное лекарство — font-display: swap: текст показывается сразу системным шрифтом, а фирменный подхватывается позже. Дополнительно используйте формат woff2, подмножество только нужных символов, минимум начертаний и preload ключевого шрифта. Шрифты лучше хранить у себя. А если фирменный шрифт не критичен — системные шрифты грузятся мгновенно и выглядят достойно.

Частые вопросы

Почему веб-шрифты замедляют сайт?
Нестандартный шрифт — это файл, который браузеру нужно скачать. Пока он грузится, текст либо не показывается (пустое место вместо слов), либо сначала рисуется системным шрифтом, а потом резко перерисовывается вашим, из-за чего страница дёргается. Оба варианта раздражают, а второй ещё и ухудшает показатель сдвигов CLS.
Что такое font-display: swap?
Это свойство CSS, которое говорит браузеру не прятать текст во время загрузки шрифта: показать его сразу системным шрифтом, а когда фирменный загрузится — подменить. В результате человек начинает читать мгновенно, без пустого экрана, а кастомный шрифт подхватывается чуть позже. Это главный приём для скорости шрифтов.
Какой формат шрифтов использовать?
woff2 — современный сжатый формат, заметно легче старых ttf и otf, и его понимают все актуальные браузеры. Дополнительно стоит оставить в файле только нужные символы (подмножество — кириллицу и латиницу), подключать лишь используемые начертания и предзагружать основной шрифт через preload.
Хранить шрифты у себя или подключать внешние?
Сегодня чаще советуют хранить шрифты у себя (self-host): это убирает лишнее соединение со сторонним доменом, даёт контроль над кэшированием и не зависит от доступности чужого сервиса. Если используете внешний источник, добавьте к его домену preconnect, чтобы сэкономить время на установку соединения.
Можно ли обойтись без веб-шрифтов?
Да, и это самый быстрый вариант. Системные шрифты, которые уже стоят на устройстве пользователя, подключаются мгновенно и выглядят аккуратно — без единого килобайта загрузки. Если фирменный шрифт для вас не принципиален, системный набор шрифтов это отличное решение для скорости.
Чем FOIT отличается от FOUT?
FOIT (Flash of Invisible Text) — браузер прячет текст, пока грузится шрифт, и на месте слов пустота. FOUT (Flash of Unstyled Text) — текст сразу показывается запасным шрифтом, а потом подменяется фирменным. FOUT лучше, потому что читать можно сразу. Свойство font-display: swap включает именно поведение FOUT.
Что такое subsetting (подмножество) шрифта?
Это урезание шрифта до нужных символов: из тысяч знаков на десятки языков оставляют только кириллицу, латиницу и базовые символы, выбрасывая иероглифы и редкие алфавиты. Файл худеет в разы. За выбор символов отвечает свойство unicode-range; для русскоязычного сайта грамотный subset — один из самых эффективных способов облегчить шрифты.