Перейти к содержимому
fontstay.dev
Исходный код на GitHub

Руководство

Коротко о том, что делает сгенерированный CSS и почему текст не прыгает, когда загружается ваш веб-шрифт.

Почему шрифты сдвигают вёрстку

Пока веб-шрифт загружается, браузер рисует текст запасным шрифтом. Когда шрифт приходит, текст перерисовывается: если глифы шире или строки выше, строки переносятся иначе и всё ниже сдвигается. Google измеряет это как Cumulative Layout Shift (CLS): 0,1 и меньше — хорошо, больше 0,25 — плохо. Если метрики запасного шрифта совпадают с метриками веб-шрифта, строки остаются на месте.

Дескрипторы @font-face, которые мы генерируем

Каждый запасной шрифт — системный шрифт через local(), объявленный с дескрипторами, которые его масштабируют: size-adjust подгоняет ширину текста, а ascent-override, descent-override и line-gap-override задают вертикальные метрики, чтобы строки имели ту же высоту. В font-family сначала идёт веб-шрифт, затем подогнанные запасные, затем общее семейство.

@font-face {
  font-family: "Inter Fallback Arial";
  src: local("Arial");
  size-adjust: 107.12%;
  ascent-override: 90.44%;
  descent-override: 22.52%;
  line-gap-override: 0%;
  unicode-range: U+20-7E, U+A0-FF;
}

body {
  font-family: "Inter", "Inter Fallback Arial", sans-serif;
}
Первая версия браузера с поддержкой (MDN browser-compat-data 8.1.5)
ДескрипторChromeEdgeFirefoxSafari
size-adjust92929217
ascent-override878789—
descent-override878789—
line-gap-override878789—
font-size-adjust127127316.4
unicode-range112363.1

— значит «не поддерживается», ? — «неизвестно». Браузеры без дескриптора просто игнорируют его, поэтому CSS безопасен везде.

Safari и вертикальные переопределения

Safari поддерживает size-adjust (с 17), но не ascent-override, descent-override и line-gap-override. Для таких браузеров генератор добавляет font-size-adjust, подгоняющий x-height веб-шрифта, и фиксированный line-height, который делает высоту строки независимой от метрик запасного шрифта.

unicode-range

Начертание с unicode-range используется только для перечисленных кодовых точек. Ограничение подогнанных запасных шрифтов символами, которые есть в веб-шрифте, не даёт подгонке применяться к глифам, которые веб-шрифт никогда не нарисует. Диапазоны сжимаются без потерь (соседние кодовые точки объединяются) и сопоставляются с наборами символов Google Fonts.

Форматы шрифтов

Для веба используйте WOFF2: он самый компактный и поддерживается всеми современными браузерами. WOFF, TrueType (TTF) и OpenType (OTF) тоже работают с @font-face. Коллекции шрифтов (TTC, OTC) браузер напрямую использовать не может, поэтому этот инструмент разбирает их на отдельные шрифты.

Лицензии шрифтов

Файл шрифта — это программа, и лицензия решает, можно ли разместить его на сайте. Сгенерированный CSS ссылается только на шрифты, уже установленные у посетителя (local()), но веб-шрифт, который вы отдаёте, должен быть лицензирован для этого:

Текст и адрес лицензии лежат в таблице имён шрифта (name ID 13 и 14), а разрешения на встраивание — в таблице OS/2 (fsType). Лицензию всегда стоит читать и на сайте источника шрифта.

Спецификации