Производительность

2026: метрические переопределения CSS @font-face для снижения CLS при смене веб-шрифтов на статическом HTML — size-adjust, подстройка ascent/descent, проверка Safari WebKit

MacHTML Lab2026.05.18около 32 мин чтения

Статические маркетинговые страницы по-прежнему теряют баллы Cumulative Layout Shift, когда дисплейный веб-шрифт заменяет системный стек: заголовок героя смещается на 4–12 px, строки цен «прыгают», Lighthouse красит CLS, хотя картинки идеальны. В 2026 году внутри @font-face можно задать size-adjust, а также ascent-override, descent-override и line-gap-override, чтобы движок до декодирования финального файла строил строки так, будто марка уже на месте. Материал для команд на MPA и статических генераторах, которым нужна воспроизводимая ветка Safari/WebKit, а не только Chromium CI. Читайте вместе с адаптивными изображениями и LCP и заголовками с balance и pretty, чтобы закрыть бюджеты изображений, типографики и CLS одновременно.

Вы получите рецепт измерений, шаблон с @supports, матрицу для font-display, пороги (полевой P75 CLS > 0,1 — сигнал тревоги, сканирование size-adjust в диапазоне 90–110 %) и напоминание об облачном Mac mini MacHTML с публичной ценой около 16,9 долларов в сутки для проверки настоящего Safari.

Почему веб-шрифты портят CLS

Системный fallback и брендовый контур редко совпадают по таблицам ascender, descender и межстрочного зазора. После font-display: swap браузер пересчитывает все строковые блоки героя, навигации и прайса. Если критический CSS встроен, а WOFF2 приезжает с CDN на 120–400 ms позже, подмена часто случается после начала прокрутки — полевой CLS хуже лабораторного Lighthouse.

font-display: block прячет текст и бьёт по FCP; отрицательные margin не масштабируются. Переопределения метрик решают геометрию стандартно и держатся до 200 % масштаба при аккуратной настройке.

Что меняют метрические переопределения

Они не трогают векторы глифов, а меняют используемые метрики шрифта для высоты строк и вертикального ритма. Ошибочный процент расползается по flex-стекам с иконочными шрифтами и локализованными строками.

Перед правками CSS зафиксируйте в DevTools три числа: высота прописных у fallback, у веб-шрифта и разница line-height: normal. Один раз записать в репозиторий дизайн-токенов — и все локали переиспользуют базу.

size-adjust и ручные override

size-adjust равномерно масштабирует метрики — обычно достаточно, если веб-шрифт выше системного всего на 2–6 %. Если обрезаются нижние выносные в польском или чешском, опустите descent-override, оставив size-adjust около 96 %. Одна ось за коммит, визуальные диффы в истории.

Оборачивайте блок в @supports (size-adjust: 90%), чтобы старые движки не инвалидировали всё правило @font-face. Сочетается с preload WOFF2.

Сочетание с font-display

Для оферт и документации — font-display: optional, CLS почти ноль. Для героя с фирменной формой — swap плюс переопределения; на киноленте WebPageTest убедитесь, что swap укладывается в 40 ms до скролла. Длинные абзацы с block на мобильном Safari часто читаются после того, как пользователь уже прокрутил.

Доступность: после каждой подстройки — короткий прогон VoiceOver, границы строк могут звучать иначе. Для многоязычных стопок с цифрами заложите 20 минут.

Финальные проценты вшивайте в пайплайн, который выдаёт одинаковые @font-face для превью и продакшена.

Особенности Safari / WebKit

WebKit применяет override уже на первой доступной фазе шрифта, иногда до окончания удалённого декодирования — плюс для CLS, минус в виде лёгкого дрейфа каретки в contenteditable. Разделяйте тесты, если маркетинговый шрифт соседствует с CMS. Сtable Safari и Safari Technology Preview могут расходиться на минор при крупных обновлениях гарнитур — гоняйте оба.

У вариативных шрифтов с высоким дефолтным opsz сначала опустите size-adjust, затем крутите оси.

Готовый фрагмент @font-face

@supports (size-adjust: 90%) {
  @font-face {
    font-family: "Brand Display";
    src: url("/fonts/brand-display.woff2") format("woff2");
    font-weight: 100 900;
    font-display: swap;
    size-adjust: 96%;
    ascent-override: 92%;
    descent-override: 24%;
    line-gap-override: 0%;
  }
}

Один вес WOFF2 держите ниже 80 КБ; на Apple Silicon декодирование часто около 30 ms, на старых Intel Air до 55 ms — фиксируйте в дашбордах.

Матрица решений

Сценарийfont-displayПереопределенияПричина
Маркетинговый геройswapsize-adjust + ascent/descentбренд важнее, CLS ограничить
Документацияoptionalлёгкий size-adjustстабильность
Моноширинный кодswapк системному monoубрать горизонтальный джиттер pre
CJK-локалиswapотдельные измеренияне копировать латинские значения

Лабораторный и полевой CLS

Lighthouse показывает эффект сразу; CrUX отстаёт до 28 дней. Собирайте web-vitals на клиенте, сегментируйте UA Safari, ставьте алерт при P75 > 0,1. Сэмплируйте session replay для длинного хвоста URL без калибровки.

При ограниченном бюджете начинайте со страниц, где текст героя даёт > 35 % суммарного CLS.

Вопросы и ответы

Вариативные шрифты?

Да: сначала оси по умолчанию, затем size-adjust, затем точечная подстройка осей.

Префетчить все начертания?

Только те, что в первом экране; лишний preload отнимает канал у LCP-картинки (до 80 ms на 4G).

Чужой CDN с CSS?

Безопасно переопределить сложно — хостите WOFF2 сами и владеете таблицей стилей целиком.

Облачный Apple Silicon Mac mini даёт тот же стек Safari/Core Text, что и ноутбуки руководства, в отличие от приближений Linux headless. Узлы MacHTML поддерживают SSH для автоматических скриншотов и сценариев WebPageTest и VNC для покадрового разбора. В простое часто около 12 Вт — аренда mini на две недели шрифтового спринта дешевле многих откатов в проде.

Аренда вместо покупки: публичная ставка около 16,9 $/день, остановка после кампании; таблицы метрик остаются в Git без 36-месячной амортизации железа.

Проверка CLS-дружественных шрифтов в настоящем Safari

Арендуйте облачный Mac mini и проверьте переопределения и момент font-display до слияния статического CSS.

Шрифты и CLS на Mac
от ~$16.9/день