Как веб-шрифты вызывают CLS и как уменьшить сдвиг макета

Как веб-шрифты вызывают CLS и как уменьшить сдвиг макета
Веб-шрифты вызывают CLS, когда после загрузки заменяют резервный шрифт и меняют размеры текстовых блоков, высоту строк или переносы. Из-за этого заголовки, кнопки, карточки и соседние элементы неожиданно перемещаются. Снизить сдвиг помогают правильные метрики fallback-шрифта, предзагрузка, оптимальный font-display и компактные файлы WOFF2.
Дата актуальности: 22 июля 2026 года. Материал посвящён технической стороне оптимизации веб-шрифтов и подходит для лендингов, интернет-магазинов, блогов и интерфейсов, где стабильность первого экрана влияет на удобство чтения и взаимодействия.
Что такое CLS и почему текст влияет на стабильность страницы
CLS, или Cumulative Layout Shift, показывает, насколько сильно содержимое страницы самопроизвольно перемещается во время загрузки. Пользователь может открыть страницу и начать нажимать кнопку, а затем из-за появления шрифта кнопка или текст окажутся в другом месте. Метрика учитывает неожиданные сдвиги, а не обычные изменения интерфейса после осознанного действия пользователя.
Шрифт влияет на геометрию макета не только размером букв. Важны ширина символов, x-height, верхние и нижние выносные элементы, межстрочный интервал и встроенные метрики файла. Если резервный шрифт заметно отличается от основного, строка может стать длиннее или короче, переносы изменятся, а многострочный текст займёт другую высоту.
Как загрузка шрифта создаёт сдвиг макета
Замена системного шрифта на основной
При медленной загрузке браузер может сначала показать текст системным шрифтом, а затем заменить его файлом сайта. Такой сценарий обычно улучшает видимость текста, но создаёт риск FOUT — краткого отображения fallback-шрифта. Если Arial, Inter, Roboto или другой резервный вариант имеет иные пропорции, браузер пересчитает ширину строк и высоту контейнеров после подстановки веб-шрифта.
Скрытый текст до завершения загрузки
При стратегии FOIT текст временно не отображается, пока браузер ждёт веб-шрифт. После загрузки содержимое появляется и занимает место, которого раньше визуально не было. Само появление текста может сдвинуть расположенные ниже блоки, особенно если высота заголовка, карточки или навигации не задана заранее.
Разные начертания загружаются в разное время
Отдельный риск возникает, когда обычное, полужирное и курсивное начертания подключены разными файлами. Заголовок может отрисоваться одним вариантом, а после загрузки нужного веса изменить ширину и количество строк. Проблема усиливается, если браузер имитирует отсутствующее начертание, а затем заменяет его настоящим файлом.
Что проверить перед оптимизацией веб-шрифтов
Сначала определите, какой именно элемент смещается и какой файл шрифта становится причиной изменения. Проверяйте страницу на холодную загрузку, при очищенном кэше и на медленном соединении: при повторном открытии шрифт может быть уже сохранён, поэтому проблема останется незаметной.
- Найдите в инструментах разработчика файлы шрифтов и время их загрузки.
- Сравните резервный и основной шрифты по ширине строк и высоте многострочного текста.
- Проверьте начертания, которые реально используются на первом экране.
- Посмотрите, появляется ли текст сразу или ждёт загрузки шрифта.
- Зафиксируйте элементы, которые перемещаются после события загрузки.
- Проверьте CLS отдельно для мобильного и десктопного viewport.
- Убедитесь, что повторная загрузка не маскирует проблему кэшем.
Полезно отдельно тестировать заголовки, кнопки, меню и карточки товаров. Одинаковый шрифт может быть безопасным для короткого заголовка, но вызвать заметный сдвиг в статье с длинными абзацами, где изменение ширины всего на несколько процентов добавляет новую строку.
Как уменьшить CLS из-за веб-шрифтов
Выберите подходящий режим font-display
Свойство font-display управляет поведением текста до загрузки шрифта. Значение swap обычно показывает fallback сразу и заменяет его основным шрифтом после загрузки. Это уменьшает риск невидимого текста, но не устраняет сдвиг, если метрики шрифтов различаются. Значение optional позволяет браузеру отказаться от поздней замены при неблагоприятных условиях, а fallback задаёт короткое окно ожидания и затем использует запасной вариант.
Для критичного текста нельзя выбирать font-display только по названию режима. Оцените компромисс между скоростью появления текста, визуальной идентичностью и стабильностью блока. Если замена всё равно происходит, основное внимание нужно уделить согласованию метрик, а не простой смене swap на другой параметр.
Предзагрузите только действительно важные файлы
Предзагрузка сообщает браузеру, что конкретный ресурс нужен как можно раньше. Она уместна для шрифта, который используется в первом экране и обязательно участвует в отображении основного текста. Предзагрузка всех весов и языковых наборов перегружает ранний этап загрузки и может замедлить более важные ресурсы.
Согласуйте адрес предзагружаемого файла с фактическим источником в CSS и укажите корректный тип ресурса. Если браузер скачает один файл заранее, а таблица стилей запросит другой формат или другое начертание, дополнительная загрузка не даст ожидаемого эффекта и увеличит сетевую нагрузку.
Согласуйте метрики fallback и основного шрифта
Самый надёжный способ уменьшить шрифтовой сдвиг — подобрать резервный шрифт с похожей шириной символов и высотой строчных букв. Для более точной настройки CSS поддерживает параметры size-adjust, ascent-override, descent-override и line-gap-override. Они позволяют масштабировать fallback и корректировать его вертикальные метрики так, чтобы переход на основной шрифт меньше менял геометрию текста.
Размер корректировки подбирают по реальному сравнению, а не по универсальному числу. Возьмите характерный заголовок и абзац, проверьте количество строк, общую высоту и положение соседних элементов. Если fallback стал визуально слишком крупным или мелким, измените масштаб и повторите тест на мобильной ширине.
Резервируйте высоту текстовых блоков
Для важных областей задавайте предсказуемую высоту через устойчивую структуру контейнера, корректный line-height и ограничения, соответствующие дизайну. Это особенно полезно для баннеров, шапки, карточек и первого заголовка. Резерв должен соответствовать реальному содержимому: чрезмерно большая пустая область ухудшает интерфейс и не является полноценным решением CLS.
Сократите объём и число вариантов шрифта
Используйте современный формат WOFF2, удаляйте неиспользуемые начертания и ограничивайте набор символов нужными языками. Подмножество кириллицы, латиницы и знаков препинания может быть разделено на отдельные файлы, если архитектура сайта действительно использует такую схему. Чем меньше файл, тем раньше завершится загрузка и тем короче окно возможной замены.
Переменный шрифт иногда позволяет объединить несколько весов в один ресурс, но не всегда уменьшает итоговую передачу данных. Сравнивайте фактический размер, покрытие символов и сценарии загрузки. Не подключайте полный семейный набор, если интерфейсу нужны только обычное и полужирное начертания.
Практические примеры настройки макета
Пример 1: заголовок меняет перенос на мобильном экране
Представьте карточку статьи с заголовком в две строки при системном шрифте. После загрузки фирменного шрифта символы становятся шире, заголовок переносится на три строки, а кнопка и изображение опускаются ниже. Сначала выберите fallback с близкой шириной, затем настройте size-adjust и проверьте высоту заголовка на самых узких поддерживаемых экранах.
Пример 2: кнопка смещается после загрузки полужирного веса
На странице оформления заказа текст кнопки сначала отображается обычным системным шрифтом, а после загрузки веса 600 становится шире. Кнопка увеличивается, соседний элемент переносится, и пользователь видит сдвиг. Решение — заранее подключить нужное начертание, не имитировать вес браузером и задать кнопке предсказуемые внутренние отступы и минимальную ширину.
Частые ошибки при оптимизации CLS
- Предзагружать все шрифты подряд, включая редко используемые веса.
- Оставлять fallback без проверки ширины, x-height и вертикальных метрик.
- Подключать одновременно несколько форматов одного и того же файла без необходимости.
- Использовать font-display как единственное средство борьбы со сдвигом.
- Проверять только закэшированную страницу без холодной загрузки.
- Задавать фиксированную высоту, которая обрезает текст при другом размере экрана.
- Загружать полный набор символов, хотя странице нужны один язык и несколько знаков.
Отдельная ошибка — пытаться убрать CLS визуальным скрытием проблемного блока. Такой подход может замаскировать симптом, но ухудшить доступность, задержать появление текста или создать скачок после снятия скрытия. Стабильность должна достигаться согласованием загрузки и геометрии, а не удалением содержимого из первого рендера.
Чеклист перед публикацией страницы
- Определите шрифты и начертания, которые видны на первом экране.
- Сохраните их в оптимизированном формате и удалите неиспользуемые варианты.
- Настройте font-display с учётом требований к видимости текста.
- Предзагрузите только критичный файл, который нужен сразу после открытия страницы.
- Подберите fallback с похожими пропорциями и настройте его метрики при необходимости.
- Проверьте переносы, высоту строк и положение соседних блоков до и после замены.
- Протестируйте холодную загрузку на мобильном и десктопном разрешениях.
- Повторите проверку после изменений в заголовках, кнопках и локализации.
Часто задаваемые вопросы о веб-шрифтах и CLS
Всегда ли веб-шрифт вызывает CLS?
Нет. Веб-шрифт не обязательно вызывает заметный сдвиг, если он быстро загружается, а его метрики близки к резервному шрифту. Риск выше при медленном соединении, позднем подключении CSS, нескольких начертаниях и большой разнице в ширине символов или высоте строк.
Что лучше выбрать: swap или optional?
Универсально лучшего значения нет. Swap быстро показывает текст и подходит, когда важна доступность содержимого, но поздняя замена может вызвать сдвиг. Optional даёт браузеру больше свободы и может избежать поздней подстановки, однако фирменный шрифт не всегда будет показан при первом посещении.
Поможет ли preload убрать сдвиг макета?
Preload сокращает время ожидания файла, но сам по себе не устраняет CLS. Если основной шрифт заметно отличается от fallback, даже быстрая замена может изменить переносы. Предзагрузку следует сочетать с подбором резервного шрифта, корректировкой метрик и ограничением количества критичных ресурсов.
Что делают size-adjust и metric overrides?
Size-adjust масштабирует резервный шрифт, а ascent-override, descent-override и line-gap-override корректируют его вертикальные метрики. Вместе эти параметры помогают приблизить fallback к основному шрифту до момента замены. Настройку нужно проверять на реальных текстах, потому что одинаковый масштаб не гарантирует одинаковую ширину всех символов.
Нужно ли использовать системные шрифты вместо веб-шрифтов?
Не обязательно. Системный стек снижает зависимость от сетевой загрузки, но может не соответствовать фирменному стилю и доступному набору символов. Веб-шрифт можно использовать безопасно, если оптимизировать файл, заранее выбрать поведение загрузки и согласовать метрики с резервным вариантом.
Как проверить, что проблема действительно связана со шрифтом?
Временно отключите загрузку веб-шрифтов и сравните поведение страницы с обычным сценарием. Затем включите сетевое ограничение и наблюдайте, какой блок меняет положение после завершения запроса шрифта. В инструментах разработчика сопоставьте момент загрузки файла с появлением нового переноса или изменением высоты контейнера.
Вывод: стабильный макет начинается с метрик шрифта
Чтобы уменьшить CLS, рассматривайте веб-шрифт как часть геометрии интерфейса, а не только как декоративный ресурс. Оптимизируйте WOFF2-файлы, загружайте критичные начертания заранее, выбирайте разумный font-display и согласуйте fallback с основным шрифтом по горизонтальным и вертикальным метрикам.