Cumulative Layout Shift (CLS) — это один из ключевых показателей Web Vitals, измеряющий стабильность визуального контента страницы. Высокий CLS напрямую влияет на пользовательский опыт: элементы страницы неожиданно смещаются, вызывая ошибки при взаимодействии и снижая ощущение качества сайта. Одним из основных источников смещения являются внешние шрифты и эффект FOUT (Flash of Unstyled Text).
Веб-шрифты загружаются асинхронно, и до момента их полной загрузки браузер отображает текст с запасным шрифтом (fallback font). Если размеры запасного и целевого шрифтов различаются, происходит изменение размеров блоков текста, что влечёт за собой смещение элементов страницы. Основные проявления:
Ключевой фактор — размеры метрик шрифта:
font-size, line-height,
font-weight и letter-spacing у запасного и
целевого шрифта. Даже незначительные различия создают CLS, особенно на
мобильных устройствах с ограниченной шириной экрана.
FOUT (Flash of Unstyled Text) возникает, когда браузер сначала рендерит текст с системным шрифтом, а затем заменяет его на веб-шрифт после загрузки. Отличие от FOIT (Flash of Invisible Text) в том, что текст изначально виден, но смещается после замены шрифта. Этот эффект напрямую влияет на CLS, поскольку:
Браузеры реализуют различные стратегии загрузки шрифтов
(font-display: swap | block | fallback | optional), каждая
из которых по-своему влияет на CLS. Оптимальный выбор стратегии может
значительно снизить смещения.
Использование font-display: optional или
swap
swap позволяет отображать текст сразу с запасным
шрифтом, заменяя его на кастомный после загрузки.optional ограничивает время ожидания кастомного шрифта,
уменьшая шанс смещения при медленном соединении.Предварительное определение метрик шрифта (Font Metrics)
font-variation-settings или CSS
size-adjust позволяет сопоставить высоту и ширину fallback
шрифта с целевым.Резервирование пространства для текста
min-height, line-height,
max-width).Preload и prefetch шрифтов
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>Cache-Control для ускорения повторных визитов.Системные шрифты как fallback
line-height и font-weight.Web Vitals API позволяет отслеживать CLS в реальном времени:
import {getCLS} from 'web-vitals';
getCLS(console.log);
Для более детального анализа используется PerformanceObserver:
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
if (entry.entryType === 'layout-shift' && !entry.hadRecentInput) {
console.log('Shift detected:', entry);
}
});
});
observer.observe({type: 'layout-shift', buffered: true});
При анализе CLS следует обращать внимание на источник
смещения. Если entry.sources указывает на
текстовые элементы, высока вероятность FOUT или несоответствия метрик
шрифтов.
font-display —
контроль загрузки и отображения шрифта.Эффективное управление CLS требует сочетания корректного подбора шрифтов, контроля загрузки и резервирования пространства для текста. Применение этих подходов снижает визуальные сдвиги, повышает воспринимаемую скорость страницы и улучшает общую стабильность интерфейса.