ToxaDab
Web разработка
CLS: Когда верстка рушит бизнес — и как это остановить
В мире, где пользователь принимает решение за доли секунды, интерфейс не имеет права на хаос. А именно хаос — это то, что приносит с собой метрика CLS (Cumulative Layout Shift). Это не просто одна из трёх метрик Core Web Vitals от Google. Это — убийца доверия, разрушитель конверсий и немой крик «почему у нас никто не покупает?!» в аналитике. Если LCP — про скорость, а FID — про отзывчивость, то CLS — про стабильность и визуальный порядок. Про то, чтобы элементы не прыгали, не съезжали и не вели себя как испуганные тараканы под светом UX-фонарика.
И в этой статье — без лирики, но с характером IRШ — мы распотрошим CLS, разложим по полкам причины, найдем виновных и вооружим тебя конкретными техническими решениями. Если ты создаёшь сайты, отвечаешь за продукт, или просто не хочешь терять деньги из-за прыгающих кнопок — с этого текста начинается твоя санитарная зачистка.
Что такое CLS — и почему он рвёт твой UX в клочья
CLS (кумулятивный сдвиг макета) — это метрика, которая измеряет насколько сильно и часто двигаются элементы страницы после того, как начинается загрузка. Иными словами: пользователь зашёл, начал читать, тянуться к кнопке — а кнопка в этот момент уехала. Не навсегда, конечно. Просто на 50 пикселей вниз. А вместе с ней — ушло и намерение кликнуть.
Визуальная стабильность — один из краеугольных UX-факторов. Google знает это, и потому CLS встроен в Core Web Vitals: если у тебя показатель выше 0.1 — ты уже в красной зоне. А если выше 0.25 — добро пожаловать в цифровой аналог мусорной свалки.
Почему CLS — это не баг, а системный провал
Когда сайт визуально нестабилен, пользователь чувствует себя обманутым. Он наводит мышку — а кнопка исчезает. Начинает читать — а текст прыгает вниз. Его намерение взаимодействовать рушится, потому что интерфейс ведёт себя непредсказуемо.
Это не просто раздражает. Это снижает конверсию, повышает bounce rate, и формирует негативный паттерн восприятия. Даже если остальное — идеально. Потому что восприятие не делится на «объективно полезно» и «субъективно удобно». Оно либо комфортно, либо нет. И всё.
Механика подсчета CLS
CLS рассчитывается по формуле, которая учитывает:
- Impact Fraction — какую часть экрана занимает сдвинутый элемент.
- Distance Fraction — насколько далеко он сдвинулся.
CLS = Impact Fraction × Distance Fraction
Пример: если большой блок (например, баннер или заголовок) сдвинулся на 25% экрана, и занимает 50% площади — CLS будет 0.25 × 0.5 = 0.125.
А теперь представь, если таких сдвигов несколько — итоговый CLS может легко пробить планку в 0.3–0.5. Это уже цифровой позор.
Топ-7 причин высокого CLS
Вот где начинается вскрытие. Вот кто виноват:
1. Изображения без заданных размеров
Браузер не знает, сколько места они займут. И сначала зарендерит текст, а потом — когда подтянется картинка — всё съедет вниз.
2. Встраиваемые элементы без размеров
Фреймы YouTube, карты, рекламные блоки, соц.виджеты — если ты не задал width
и height
, интерфейс будет прыгать при их загрузке.
3. Динамический контент, вставляемый позже
Любая подгрузка отзывов, баннеров, рекомендаций — если не зарезервировано пространство, вся верстка пойдёт по одному месту.
4. Шрифты без font-display: swap
Сначала браузер покажет system font, а потом, при загрузке веб-шрифта — изменится межстрочный интервал, ширина блоков и т.д.
5. Анимации, вызывающие layout shift
Анимации на top
, left
, width
, height
вызывают перерасчёт потока. Используй transform
, если не хочешь лупить себя по лбу.
6. Lazy Load на первом экране
Ты решил, что всё «lazy» — это круто. А теперь баннер на первом экране грузится позже, и интерфейс прыгает. Браво.
7. Скрипты, которые вставляют элементы
Чаты, триггеры, попапы. Они часто появляются уже после загрузки. И ломают макет, потому что никто не зарезервировал под них место.
Как диагностировать CLS
Тебе нужно видеть движение, а не просто цифру. Вот инструменты:
- PageSpeed Insights — показывает текущий CLS и что его вызывает.
- Lighthouse — в DevTools, вкладка «Performance». Запусти запись и смотри график.
- WebPageTest — водопад ресурсов, что когда грузится.
- Chrome DevTools → Rendering → Layout Shift Regions — включи и увидишь прямоугольники, где был сдвиг.
Как исправить CLS — конкретно и без воды
Если ты хочешь результат, а не оправдания — вот твой чеклист:
📌 Всегда задавай размеры для изображений
<img src="banner.jpg" width="600" height="400" alt="Banner">
📌 То же самое — для iframe, video, embed
<iframe width="560" height="315" src="..."></iframe>
📌 Используй aspect-ratio
в CSS
img {
aspect-ratio: 3 / 2;
width: 100%;
height: auto;
}
📌 Добавляй font-display: swap
в @font-face
@font-face {
font-family: 'MyFont';
src: url('myfont.woff2') format('woff2');
font-display: swap;
}
📌 Зарезервируй место под баннеры и динамику
Используй скелетоны, min-height, placeholder-блоки.
📌 Не вставляй блоки без контейнеров
Если скрипт вставит баннер — выдели под него заранее div
с размерами.
📌 Избегай layout-ломающих анимаций
transform: translateY()
вместо top
, scale
вместо width
.
CLS и мобильные устройства
На мобилках ситуация в 10 раз хуже:
- Экран меньше → любые сдвиги кажутся масштабнее.
- Процессор слабее → рендеринг медленнее.
- Часто используется медленный интернет → ресурсы приходят поздно.
CLS на мобильных — это драма UX. Поэтому там — оптимизация в первую очередь.
Как встроить CLS в процесс
Ты не должен бороться с CLS вручную каждый раз. Вот как это автоматизировать:
- Добавь Lighthouse в CI/CD — пусть отчёты генерируются на каждом пуше.
- Используй Web Vitals Report в Google Analytics 4.
- Поставь alerts на PageSpeed drops через API.
- Проводи A/B-тесты по CLS-устойчивости.
CLS и SEO: это влияет на ранжирование
Да. CLS — часть Core Web Vitals, которые с 2021 года учитываются в алгоритмах поиска Google. Если ты в красной зоне — твою страницу вытеснят те, у кого всё стабильно и не прыгает.
Ты можешь писать тексты лучше всех. Но если твоя верстка прыгает, как загнанный лось — ты вне выдачи.
Финальный разбор
CLS — это не про пиксели. Это про восприятие стабильности. Это про то, как один сдвинувшийся блок рушит всю воронку продаж.
И ты либо это понимаешь и делаешь как надо, либо продолжаешь спрашивать в понедельник: «А почему у нас опять нет заявок?»
Визуальный сдвиг — это удар по доверию.
А доверие — это то, чего ты точно не можешь терять. Ни на первом экране. Ни на втором. Ни вообще.