FOIT и FOUT: почему исчезает текст и как это диагностировать

FOIT и FOUT: кратко о главном
FOIT и FOUT описывают два визуальных сценария загрузки веб-шрифта. При FOIT браузер временно не показывает текст, пока ждёт файл шрифта. При FOUT текст появляется сразу резервным шрифтом, а после загрузки веб-шрифта меняет внешний вид. Оба эффекта возникают на этапе подмены или ожидания шрифта и диагностируются через сеть, CSS и отрисовку страницы.
Дата актуальности: 22 июля 2026 года. В современных проектах проблему обычно решают не одним свойством CSS, а сочетанием правильного font-display, компактных файлов, подходящего fallback-шрифта и контроля момента загрузки.
Что такое FOIT и почему текст становится невидимым
FOIT расшифровывается как Flash of Invisible Text — кратковременное отображение невидимого текста. Браузер знает, что элемент должен использовать веб-шрифт, но файл ещё не готов. Вместо немедленной подстановки другого шрифта он может оставить текст скрытым на некоторое время, чтобы пользователь не увидел промежуточный вариант.
Для читателя FOIT выглядит как пустой блок: заголовок или абзац уже занимает место в макете, но букв не видно. Если загрузка задерживается из-за медленного соединения, блокировки запроса, ошибки CORS или слишком тяжёлого файла, невидимый текст может сохраняться заметно дольше ожидаемого. Особенно критичен эффект для первого экрана, навигации и кнопок.
Что провоцирует FOIT
Чаще всего FOIT связан с настройкой font-display: block либо с поведением браузера по умолчанию, когда автор явно не указал стратегию показа шрифта. Дополнительные причины — медленный CDN, запрос шрифта после критического CSS, отсутствие предварительной загрузки для действительно важного начертания и неудачная политика кеширования.
- Шрифт подключён только через несколько внешних CSS-файлов.
- Файл содержит много ненужных языков и символов.
- Запрос блокируется политикой безопасности или ошибкой CORS.
- В CSS указан файл, которого нет на сервере.
- Текст находится в первом экране, но шрифт загружается с низким приоритетом.
Что такое FOUT и откуда берётся скачок начертания
FOUT расшифровывается как Flash of Unstyled Text — кратковременный показ текста без нужного оформления. Страница сначала использует резервный шрифт, например системный sans-serif, а после получения файла переключается на фирменное начертание. Сам текст не исчезает, но меняются ширина символов, межстрочные интервалы и переносы.
FOUT заметен по нескольким признакам: заголовок внезапно переносится на другую строку, кнопка расширяется, карточки меняют высоту, а интерфейс на долю секунды выглядит иначе. Если после загрузки шрифта меняется геометрия элементов, пользователь воспринимает это как мерцание или нестабильность страницы. Такой сценарий связан не только с эстетикой, но и с визуальной стабильностью макета.
FOIT и FOUT: в чём практическая разница
FOIT ухудшает доступность контента в момент ожидания: пользователь видит пустое место и может решить, что страница сломалась. FOUT сохраняет читаемость, но создаёт переход между двумя визуальными состояниями. Поэтому для текстового контента обычно важнее не скрывать буквы, а обеспечить предсказуемую замену и уменьшить различия между резервным и основным шрифтом.
Как браузер загружает и применяет веб-шрифт
После разбора HTML и CSS браузер определяет, какие текстовые элементы используют нестандартный шрифт. Затем он формирует запрос к файлу, проверяет доступность ресурса, получает данные и подготавливает шрифт к отрисовке. До этого момента браузер выбирает поведение, заданное font-display или настройками по умолчанию.
Свойство font-display определяет компромисс между ожиданием и немедленной видимостью текста. Значение block допускает период невидимого текста, swap быстро показывает fallback и затем заменяет его, fallback использует короткое ожидание и ограничивает длительность замены, а optional позволяет браузеру решить, нужен ли веб-шрифт при конкретных условиях. Выбор зависит от роли шрифта: для логотипа и крупного заголовка допустим один сценарий, для основного текста — другой.
- Определите, какие начертания нужны до прокрутки и действительно влияют на первый экран.
- Проверьте, не загружаются ли одновременно лишние веса, курсива и языковые подмножества.
- Сопоставьте основной шрифт с fallback по ширине знаков, высоте строчных и межстрочному интервалу.
- Решите, что важнее для конкретного блока: мгновенная читаемость или точное первое отображение бренда.
Как отличить FOIT от проблем CSS и шрифтового файла
Исчезновение текста не всегда означает FOIT. Элемент может быть скрыт правилом display: none, opacity: 0, visibility: hidden или цветом, совпадающим с фоном. Проблема также возникает, если CSS применяет несуществующее семейство, если у текста отсутствует нужный вес или если шрифт содержит повреждённые данные.
Диагностика в DevTools
Начинайте проверку с воспроизводимого сценария: откройте страницу в приватном окне, очистите кеш или включите ограничение скорости сети. Затем наблюдайте за моментом появления текста и сравнивайте его с запросом файла шрифта. Такая последовательность помогает отделить сетевую задержку от ошибки в стилях и не перепутать FOUT с обычной перестройкой интерфейса.
- Откройте вкладку Network и отфильтруйте запросы по типу Font или по расширениям woff2, woff и ttf.
- Проверьте статус ответа, размер файла, время загрузки и наличие повторных запросов.
- Откройте вкладку Elements и убедитесь, что к нужному элементу применилось правильное font-family и font-weight.
- Посмотрите Computed Styles: браузер должен показывать итоговые свойства, а не только правила из исходного CSS.
- Проверьте консоль на ошибки CORS, MIME-типа, отсутствующего файла и отказа в загрузке ресурса.
- Включите в панели Rendering эмуляцию медленного соединения и сравните поведение с отключённым кешем.
- Зафиксируйте, меняется ли геометрия блока после загрузки: переносы, высота строк, ширина кнопок и положение соседних элементов.
Что проверить в CSS и HTML
В объявлении @font-face проверьте имя семейства, диапазон font-weight, стиль font-style и путь к файлу. Если загружается обычное начертание, а элемент запрашивает полужирное, браузер может синтезировать его или ждать другой ресурс. Также проверьте порядок подключения стилей: позднее правило или более специфичный селектор способен отменить ожидаемый font-family.
Как устранить FOIT и сделать FOUT менее заметным
Настройте font-display под задачу
Для длинного текста и интерфейсных подписей обычно выбирают стратегию, которая сохраняет читаемость при задержке сети. swap быстро показывает резервный шрифт, но может сделать замену очень заметной. fallback уменьшает период ожидания и не всегда переключает уже показанный fallback. На практике решение принимают отдельно для основного текста, заголовков, иконок и декоративных элементов.
Сократите и правильно отдавайте файлы
Для веба предпочтителен современный сжатый формат, если он поддерживается целевыми браузерами. Удалите неиспользуемые веса, стили и символы, а для кириллического проекта рассмотрите подмножество, в котором остаются нужные языки и знаки. Не подключайте четыре начертания на первом экране, если видимому контенту требуется только regular и bold.
Убедитесь, что сервер разрешает кеширование неизменяемых файлов и отдаёт корректный Content-Type. Если шрифт размещён на другом домене, настройте CORS так, чтобы браузер мог использовать ресурс. Предварительная загрузка через preload оправдана только для шрифта, который точно понадобится сразу: лишние preload-запросы конкурируют с CSS, изображениями и скриптами.
Подберите fallback по метрикам шрифта
Главный источник заметного FOUT — не сам факт замены, а различие между шрифтами. Сравните ширину букв, x-height, насыщенность и высоту строки. Если резервный шрифт значительно шире основного, заголовок может занимать больше строк до загрузки веб-шрифта. Для более точного сопоставления используют font-size-adjust, а в современных CSS-сценариях также настраивают ascent-override, descent-override и line-gap-override, если это необходимо для контроля метрик.
Практический пример диагностики на странице
Представьте лендинг с заголовком «Создайте собственный шрифт». На быстром соединении он выглядит нормально, но при ограничении скорости сначала появляется системный шрифт, затем заголовок становится уже и переносится иначе. В Network запрос woff2 завершается успешно, а в Computed Styles после загрузки видно нужное семейство. Это не ошибка текста: перед вами FOUT, усиленный различием метрик.
Исправление начинается с определения реального веса, который нужен заголовку. Затем выбирают более похожий fallback, сокращают файл до используемых символов, проверяют кеширование и тестируют страницу на холодной загрузке. Если заголовок критичен для первого экрана, его начертание можно загружать заранее, но только после проверки, что запрос не мешает основным ресурсам.
Частые ошибки при работе с веб-шрифтами
- Скрывать весь текст до полной загрузки страницы, чтобы избежать FOUT. Такой подход превращает короткую замену в FOIT и ухудшает восприятие контента.
- Загружать все доступные веса шрифта на каждой странице, хотя используется только несколько начертаний.
- Использовать preload для каждого файла. Предварительная загрузка нужна ограниченному числу критичных ресурсов, а не всей коллекции.
- Проверять только быструю сеть. На мобильном соединении задержка и порядок запросов могут полностью изменить визуальный результат.
- Считать любой скачок макета проблемой шрифта. Сначала исключите изображения без размеров, поздние скрипты и динамический контент.
- Не тестировать кириллицу, цифры, кавычки и специальные символы. Отсутствующий глиф может выглядеть как отдельная проблема отображения.
- Подключать локальную и удалённую копию без ясной стратегии. Разные версии файла способны давать непредсказуемое начертание и сложную диагностику.
Чеклист проверки FOIT и FOUT
Используйте чеклист перед публикацией страницы или после смены фирменного шрифта. Проверяйте не только факт успешной загрузки, но и то, как меняется текст в реальных условиях: на холодном кеше, при замедленной сети, на мобильном экране и в разных языковых версиях.
- Определите, наблюдается ли невидимый текст, временная замена или ошибка загрузки.
- Проверьте все объявления @font-face и соответствие font-family, font-weight и font-style.
- Оставьте только необходимые форматы, веса, стили и языковые подмножества.
- Настройте font-display отдельно для основного текста и декоративных элементов.
- Сопоставьте fallback с основным шрифтом по ширине и вертикальным метрикам.
- Проверьте статус, размер, заголовки ответа, CORS и кеширование файлов.
- Протестируйте холодную загрузку при медленной сети и измерьте визуальные изменения блоков.
- Убедитесь, что текст остаётся читаемым, а заголовки и кнопки не меняют критично свою геометрию.
Часто задаваемые вопросы
Что опаснее для сайта: FOIT или FOUT?
FOIT чаще сильнее вредит доступности, потому что пользователь временно не видит текст и элементы управления. FOUT сохраняет содержимое, но может вызвать мерцание и изменение макета. Для большинства текстовых блоков безопаснее обеспечить быструю читаемость и минимизировать различие между fallback и веб-шрифтом.
Можно ли полностью исключить FOUT?
Полностью исключить замену нельзя, если веб-шрифт загружается отдельно от страницы и пользователь видит её до завершения запроса. Эффект можно сделать почти незаметным: уменьшить файл, использовать кеш, загрузить критичное начертание заранее и подобрать fallback с близкими метриками. Иногда для второстепенного текста разумно оставить системный шрифт постоянно.
Помогает ли font-display: swap от FOIT?
Да, swap обычно разрешает показывать текст резервным шрифтом до готовности веб-шрифта, поэтому длительное скрытие букв не становится основным сценарием. Однако swap не устраняет FOUT и не исправляет ошибки пути, CORS, неправильного веса или слишком тяжёлого файла. Его нужно сочетать с оптимизацией ресурсов и настройкой fallback.
Почему после загрузки шрифта меняется перенос заголовка?
Разные шрифты занимают разную ширину при одинаковом размере. Если fallback шире или уже основного начертания, текст переносится на другое количество строк, а высота блока изменяется. Проверьте ширину знаков, x-height, размер шрифта, межстрочный интервал и возможности управления метриками через CSS.
Нужно ли всегда использовать preload для шрифтов?
Нет. Preload оправдан для небольшого числа шрифтов, которые гарантированно нужны на первом экране. Если заранее загружать второстепенные или неиспользуемые файлы, браузер потратит приоритетные сетевые ресурсы на них и может позже получить критические CSS, изображения или скрипты.
Как понять, что проблема именно в CORS?
Обычно браузер сообщает об отказе в консоли, а запрос шрифта во вкладке Network получает ошибку или не используется страницей, хотя файл существует. Проверьте домен страницы, домен файла и заголовок Access-Control-Allow-Origin. Исправлять нужно серверную конфигурацию, а не скрывать текст дополнительным CSS.
Вывод: как сделать загрузку шрифта предсказуемой
FOIT скрывает текст во время ожидания веб-шрифта, а FOUT показывает fallback с последующей заменой. Чтобы устранить проблему, определите сценарий в DevTools, проверьте сетевой запрос и CSS, сократите файлы, настройте font-display и подберите резервный шрифт с близкими метриками. После этого повторите тест на холодном кеше и медленной сети.
Если проекту нужен узнаваемый шрифт для сайта, бренда или интерфейса, создайте собственное начертание на fontgenerator.ru и заранее проверьте его веб-версию, веса и кириллическую поддержку. Грамотно подготовленный файл поможет сохранить характер дизайна без лишних задержек при загрузке.