По мере загрузки веб-шрифта вы можете регулировать его масштаб, чтобы нормализовать размеры шрифтов в документе и предотвратить смещение макета при переключении между шрифтами.
Рассмотрим следующий пример , где font-size составляет 64px , и единственное различие между этими заголовками заключается в font-family . Примеры слева не были скорректированы и имеют непостоянный конечный размер. Примеры справа используют size-adjust , чтобы гарантировать, что 64px являются постоянным конечным размером.
В этой статье рассматривается новый CSS-дескриптор шрифта под названием size-adjust . Также демонстрируются несколько способов корректировки и нормализации размеров шрифтов для более удобного пользовательского интерфейса, согласованных систем дизайна и более предсказуемой компоновки страниц. Одним из важных примеров использования является оптимизация рендеринга веб-шрифтов для предотвращения кумулятивного смещения макета (CLS).
Вот интерактивная демонстрация проблемного пространства. Попробуйте изменить шрифт с помощью выпадающего списка и понаблюдайте:
- Разница в росте в результатах.
- Резкие визуальные переходы между контентными элементами.
- Интерактивные целевые области, перемещающиеся в выпадающем списке (он скачет туда-сюда!).
Как масштабировать шрифты с помощью size-adjust
Введение в синтаксис:
@font-face {
font-family: "Adjusted Typeface";
size-adjust: 150%;
src: url(some/path/to/typeface.woff2) format('woff2');
}
- Создает пользовательский шрифт с именем
Adjusted Typeface. - Использует
size-adjustдля увеличения размера каждого глифа до 150% от его стандартного размера. - Это влияет только на единственный импортированный шрифт.
Используйте указанный выше пользовательский шрифт следующим образом:
h1 {
font-family: "Adjusted Typeface";
}
Снижение уровня CLS за счет бесшовной замены шрифтов.
На следующем GIF-изображении посмотрите примеры слева и увидите, как происходит сдвиг при изменении шрифта. Это всего лишь небольшой пример с одним элементом заголовка, и проблема очень заметна.
Для улучшения отображения шрифтов отличным методом является замена шрифтов . Сначала отобразите быстро загружаемый системный шрифт, чтобы показать контент, а затем замените его веб-шрифтом, когда веб-шрифт загрузится полностью. Это дает вам лучшее из обоих миров: контент виден как можно быстрее, и вы получаете красиво оформленную страницу, не тратя время пользователя на просмотр контента. Однако проблема в том, что иногда при загрузке веб-шрифта происходит смещение всей страницы, поскольку он отображается с немного другой высотой блока.
Добавление size-adjust в правило @font-face устанавливает глобальную корректировку глифа для шрифта. Правильное использование этого параметра приведет к минимальным визуальным изменениям и плавной замене. Для создания плавной замены можно выполнить корректировку вручную или воспользоваться калькулятором size-adjust от Мальте Убла .
@font-face . В начале этого поста проблема с размером шрифта решалась методом проб и ошибок. size-adjust в исходном коде корректировался до тех пор, пока один и тот же заголовок в шрифтах Cookie и Arial не стал отображаться с тем же 64px , что и Press Start 2P . Я выровнял два шрифта по целевому размеру.
@font-face {
font-family: 'Adjusted Arial';
size-adjust: 86%;
src: local(Arial);
}
@font-face {
font-family: 'Cookie';
size-adjust: 90.25%;
src: url(...woff2) format('woff2');
}
Калибровка шрифтов
Вы, как автор, определяете целевые параметры калибровки для нормализации масштаба шрифта. Вы можете нормализовать шрифт Times, Arial или системный шрифт, а затем настроить пользовательские шрифты в соответствии с ними. Или же вы можете настроить локальные шрифты в соответствии с тем, что вы скачали.
Стратегии калибровки size-adjust :
- Удалённая цель:
Скорректируйте локальные шрифты, используя загруженные шрифты. - Локальная цель:
Настройте загруженные шрифты в соответствии с локальными целевыми шрифтами.
Пример 1: Удалённая цель
Рассмотрим следующий фрагмент кода, который изменяет размер локально доступного шрифта в соответствии с размером удаленного пользовательского шрифта. Целью калибровки является удаленный пользовательский шрифт, например, фирменный шрифт:
@font-face {
font-family: "Adjusted Regular Arial For Brand";
src: local(Arial);
size-adjust: 90%;
}
@font-face {
font-family: "Rad Brand";
src: url(some/path/to/a.woff2) format('woff2');
}
html {
font-family: "Rad Brand", "Adjusted Regular Arial For Brand";
}
В этом примере локальный шрифт Arial корректируется в ожидании загруженного пользовательского шрифта, обеспечивая плавную замену.
Преимущество этой стратегии заключается в том, что она предлагает дизайнерам и разработчикам один и тот же шрифт для разных размеров и типографики. В качестве эталона используется бренд. Это отличная новость для дизайн-систем.
Калькулятор Malte работает, ориентируясь на используемый в качестве основного шрифта бренд. Выберите шрифт Google Fonts, и он рассчитает, как адаптировать Arial для плавной замены. Вот пример CSS для Roboto из калькулятора , где загружен шрифт Arial с именем "Roboto-fallback":
@font-face {
font-family: "Roboto-fallback";
size-adjust: 100.06%;
src: local("Arial");
}
Для создания полностью кроссплатформенной настройки см. следующий пример, в котором представлены 2 скорректированных локальных резервных шрифта в ожидании фирменного шрифта.
@font-face {
font-family: "Roboto-fallback-1";
size-adjust: 100.06%;
src: local("Arial");
}
@font-face {
font-family: "Roboto-fallback-2";
size-adjust: 99.94%;
src: local("Arimo");
}
@font-face {
font-family: "Roboto Regular";
src: url(some/path/to/roboto.woff2) format('woff2');
}
html {
font-family: "Roboto Regular", "Roboto-fallback-1", "Roboto-fallback-2";
}
Пример 2: Локальная цель
Рассмотрим следующий фрагмент кода, который адаптирует фирменный шрифт под шрифт Arial:
@font-face {
font-family: "Rad Brand - Adjusted For Arial";
src: url(some/path/to/a.woff2) format('woff2');
size-adjust: 110%;
}
html {
font-family: "Rad Brand - Adjusted For Arial", Arial;
}
Преимущество этой стратегии заключается в том, что она выполняется без каких-либо корректировок, а затем вносит необходимые изменения в исходные шрифты для соответствия этим изменениям.
Более тонкая настройка с помощью ascent-override , descent-override и line-gap-override
Если стандартного масштабирования глифов недостаточно для настройки вашего дизайна или стратегий загрузки, вот несколько более тонких параметров, которые работают вместе с size-adjust . Свойства ascent-override , descent-override и line-gap-override в настоящее время реализованы в Chromium 87+ и Firefox 89+.

ascent-override
Дескриптор ascent-override определяет высоту шрифта над базовой линией.
@font-face {
font-family: "Ascent Adjusted Arial Bold";
src: local(Arial Bold);
ascent-override: 71%;
}
Красный заголовок (без корректировки) имеет отступ над заглавными буквами A и O, в то время как синий заголовок был скорректирован таким образом, чтобы высота его заглавных букв плотно прилегала к общему ограничивающему прямоугольнику.
descent-override
Дескриптор descent-override определяет высоту шрифта ниже базовой линии.
@font-face {
font-family: "Ascent Adjusted Arial Bold";
src: local(Arial Bold);
descent-override: 0%;
}
Красный заголовок (без корректировки) имеет отступ ниже базовой линии букв D и O, в то время как синий заголовок был скорректирован таким образом, что его буквы плотно прилегают к базовой линии.
line-gap-override
Дескриптор line-gap-override определяет метрику межстрочного интервала для шрифта. Это рекомендуемый шрифтом межстрочный интервал или внешний межстрочный интервал.
@font-face {
font-family: "Line Gap Adjusted Arial";
src: local(Arial);
line-gap-override: 50%;
}
Красный заголовок (без корректировки) не имеет line-gap-override , по сути, он равен 0% , в то время как синий заголовок был увеличен на 50%, создав соответствующее пространство над и под буквами.
Собираем всё воедино
Каждый из этих параметров позволяет дополнительно обрезать лишнее за пределами безопасной текстовой рамки веб-сайта. Вы можете настроить текстовое поле для более точного отображения.
Заключение
Функция CSS @font-face size-adjust — это интересный способ настроить ограничивающую рамку текста в веб-макетах, чтобы улучшить процесс смены шрифтов и избежать смещения макета для пользователей. Для получения дополнительной информации ознакомьтесь с этими ресурсами:
- Спецификация CSS-шрифтов, уровень 5
- Изменение размера на MDN
- Бесшовная замена @font-face generator
- На сайте web.dev используется кумулятивное смещение макета (CLS).
- Новый способ уменьшить влияние загрузки шрифтов: CSS-дескрипторы шрифтов
Фотография Кристиана Стрэнда с сайта Unsplash.