Какие знаешь проблемы при подключении шрифтов

Ответ

  1. FOUT (Flash of Unstyled Text) – браузер показывает системный шрифт до загрузки кастомного. Решение: font-display: swap в @font-face.
  2. FOIT (Flash of Invisible Text) – текст не отображается, пока шрифт не загрузится. Тоже решается font-display: swap.
  3. Разные форматы шрифтов – для кроссбраузерности нужно подключать несколько форматов (WOFF2, WOFF, TTF).
  4. Большой размер файла – оптимизация через подмножество глифов (например, unicode-range) или сжатие.
  5. CORS – если шрифты на другом домене, нужны правильные заголовки.

Пример подключения:

@font-face {
  font-family: 'CustomFont';
  src: url('font.woff2') format('woff2'),
       url('font.woff') format('woff');
  font-display: swap;
}

Ответ 18+ 🔞

Слушай, а вот эта хуйня с веб-шрифтами — это просто отдельный вид адского цирка. Сидит верстальщик, пьёт кофе, думает, какой бы элегантный font-weight: 300 прихуячить, а у пользователя вместо текста — или пустота, или, что хуже, системный Tahoma ебёт глаза.

Первая засада — FOUT (Flash of Unstyled Text). Это когда браузер, такой умный, сначала показывает текст тем, что у него под рукой (читай: тем, что в системе есть), а потом, когда твой красивый шрифт доползёт, резко его подменяет. Страница дёргается, как будто её током хуярит. Вторая — FOIT (Flash of Invisible Text). Это ещё веселее: браузер такой гордый, мол, я буду ждать твой дизайнерский перл, и пока он грузится, пользователь пялится в пустые белые квадраты. Сидит и думает: «Интернет сломался, нахуй?».

Решение-то, в общем, простое, как три копейки. В объявлении @font-face надо прописать font-display: swap;. Это как сказать браузеру: «Не будь идиотом, покажи хоть что-то системное, а как моё приедет — подменишь, и все довольны».

Ну и дальше по списку. Чтобы этот ваш шрифт везде работал, его надо накормить браузеру в разных форматах. Сейчас золотой стандарт — WOFF2, он лучше всех сжат. На всякий пожарный добавляешь WOFF для совсем древних, но ещё живых зверьков. TTF — это уже для совсем археологических раскопок, но иногда и его просят.

С размером — отдельная песня. Дизайнер принёс шрифт на 2 мегабайта, в котором есть и кириллица, и какая-то хуйня вроде вьетнамских диакритических знаков, которые тебе нахуй не сдались. Решение — unicode-range. Этой магической директивой ты говоришь браузеру: «Грузи только кириллические символы, а всю остальную экзотику, если она вдруг понадобится, потом докачаешь». Экономия — овердохуищная.

И последнее, но не по важности — CORS. Если шрифты лежат на другом домене (например, на CDN), а сайт на твоём, то сервер, отдающий шрифты, должен посылать правильные заголовки (Access-Control-Allow-Origin: *), иначе браузер возьмёт и нахуй его заблокирует. Будет в консоли красная ошибка, а на сайте — пустота. Красота, ёпта.

Вот, смотри, как это всё в коде выглядит, если собрать в кучу:

@font-face {
  font-family: 'CustomFont';
  src: url('font.woff2') format('woff2'),
       url('font.woff') format('woff');
  font-display: swap; /* Главная панацея от FOUT/FOIT */
  font-weight: 400;
  /* unicode-range: U+0400-04FF; // Если хочешь только кириллицу */
}

Вот и вся магия. Сделал так — и пользователь не успеет подумать «чё за пиздец», как текст уже на месте. А волнение ебать — ноль.