Заявка
Mobile · CWV

font-display: swap

font-display CSS

font-display: swap — это значение CSS-свойства, при котором браузер сразу показывает текст системным шрифтом, а затем подменяет его веб-шрифтом. Убирает эффект невидимого текста (FOIT) при загрузке страницы.

font-display: swap — это дескриптор CSS, который управляет тем, как браузер ведёт себя, пока веб-шрифт ещё качается. Что это значит на практике: браузер не прячет текст, а рисует его резервным системным шрифтом немедленно и меняет начертание, как только основной файл загрузится. Дескриптор задаётся внутри правила @font-face рядом с src.

Значение swap напрямую бьёт по Core Web Vitals: пустой блок текста в первые секунды загрузки портит LCP и мешает пользователю читать. Проверить поведение шрифта можно в PageSpeed Insights и во вкладке Network инструментов разработчика — там видно, сколько времени файл шрифта грузится и когда происходит подмена начертания.

§ 01Зачем нужен дескриптор

Без указанного правила загрузки шрифта браузер по умолчанию прячет текст на период до 3 секунд, пока грузится веб-шрифт — это и есть FOIT, эффект невидимого текста. Значение swap сокращает период блокировки почти до нуля: системный шрифт показывается сразу, подмена происходит в фоне. Взамен появляется FOUT — короткая вспышка нестилизованного текста при смене начертания. Для контентных страниц читаемость с первой секунды важнее плавности, поэтому swap берут по умолчанию.

§ 02Как настраивается

Дескриптор прописывается внутри блока @font-face: font-display: swap; ставится рядом с font-family и src. У свойства пять значений: auto, block, swap, fallback, optional — они отличаются длиной периода блокировки и периода подмены. При подключении шрифта через Google Fonts то же поведение включается параметром &display=swap в URL. Локальные шрифты требуют ручной правки CSS.

Кейс медиа

FOIT −100%, LCP 3.1→2.4 c — Новостной портал на WordPress с 4 весами Roboto подключил font-display:swap и preload для основного начертания. Невидимый текст исчез, LCP упал с 3.1 до 2.4 с за 3 недели. Замер через PSI и CrUX-75th, отказы снизились на 8%.

Кейс SaaS

FCP 2.8→1.9 c — B2B SaaS-лендинг на Next.js с MRR $180k заменил блокирующую загрузку Inter на self-hosted с font-display:swap. Текст стал рендериться сразу системным шрифтом, FCP улучшился с 2.8 до 1.9 с за 4 недели. Динамика по GA4 и Lighthouse CI.

§ 03Как проверить, что работает

Откройте вкладку Network в инструментах разработчика, отфильтруйте по типу Font и перезагрузите страницу с троттлингом сети — на медленном соединении подмена начертания видна глазом. PageSpeed Insights в разделе диагностики отдельно помечает шрифты без правила отображения предупреждением о невидимом тексте. Проверьте, что резервный системный шрифт по метрикам близок к основному: сильная разница в ширине символов вызывает сдвиг макета и портит метрику CLS.

§ 04Подводные камни

FOUT при swap заметнее, если резервный и основной шрифты сильно различаются по начертанию — текст прыгает в момент подмены. Снизить сдвиг помогают дескрипторы size-adjust, ascent-override и подбор близкого системного fallback. Для иконочных шрифтов swap не подходит: вместо иконок мелькнут случайные символы, здесь берут block или optional. Ускорить саму загрузку файла помогает <link rel=preload> для критичных начертаний.

Частые ошибки
01
Применение swap к иконочным шрифтам. На иконки вешают swap, и до подгрузки веб-шрифта пользователь видит квадраты-заглушки или чужие глифы вместо иконок. Страдает восприятие интерфейса и доверие к бренду в первые секунды сессии. Как правильно: Используйте font-display: block для иконок и swap только для текстовых шрифтов. Разделяйте @font-face по назначению.
02
Отказ от preload ключевого шрифта. Со swap текст рисуется системным шрифтом, но подмена случается поздно — браузер находит @font-face только после парсинга CSS. Пользователь ловит заметный сдвиг макета (CLS), проседает Core Web Vitals. Как правильно: Добавляйте для основного начертания и подрезайте набор через unicode-range.
03
Оценка эффекта swap в Chrome DevTools. Разработчик смотрит подмену на быстром Wi-Fi и не видит проблемы, а Google измеряет CLS по CrUX — реальным сессиям на мобильном 4G, где окно подмены длиннее. Метрика в отчёте оказывается хуже, чем в лаборатории. Как правильно: Замеряйте влияние по field-данным CrUX и PageSpeed Insights, а не по локальному прогону. Сравнивайте с окном 28 дней.
Часто спрашивают

font-display: swap — частые вопросы

font-display: swap простыми словами — что это и что даёт?

+

Это значение CSS-дескриптора, при котором браузер сразу рисует текст системным шрифтом, а после загрузки подменяет его веб-шрифтом. Так уходит эффект невидимого текста (FOIT), и пользователь читает контент с первых миллисекунд, не глядя на пустое место.

Браузер даёт шрифту нулевой период блокировки и бесконечный период подмены. Текст рисуется резервным шрифтом мгновенно, а когда веб-шрифт скачался, символы перерисовываются им. Побочный эффект — короткое мерцание (FOUT) в момент замены начертания.

FOIT — это невидимый текст: буквы скрыты, пока шрифт грузится (поведение block). FOUT — текст сразу виден резервным шрифтом и потом перерисовывается. Значение swap ведёт именно к FOUT, что для чтения безопаснее пустоты.

Да, стратегия отображения шрифта напрямую бьёт по CLS: перерисовка может дёргать вёрстку. По опыту GUSAROV, связка с size-adjust и предзагрузкой preload держит сдвиг макета ниже порога 0,1 и улучшает First Contentful Paint.

Добавьте строку font-display: swap; внутрь правила @font-face рядом с src. Для Google Fonts достаточно параметра &display=swap в URL. Проверить результат помогают Lighthouse и вкладка Network в DevTools за пару секунд.

Не нашли ответ?

Спросите Андрея Гусарова — отвечаю в течение 1-2 рабочих дней.

Нажимая, вы соглашаетесь с обработкой данных.