Исправляйте худший cluster, а не случайный элемент

Как уменьшить CLS самостоятельно

Запишите загрузку и полный сценарий в Chrome Performance, выберите самый большой cluster, найдите moved elements и потенциального виновника. Способ исправления зависит от причины сдвига.

Процесс от записи layout shift cluster к причине, исправлению и повторному тесту
Одно небольшое изменение проверяется тем же trace и сценарием.

Самый безопасный путь

Сообщение разработчику

«Запишите Performance на проблемном mobile/desktop URL при загрузке и действиях, найдите worst Layout Shifts cluster, moved elements и culprit. Исправьте общую причину: intrinsic size/aspect-ratio, зарезервированный ad/embed slot, стабильный font fallback, место для injected content или transform-анимацию. Повторите тот же trace и не скрывайте проблему фиксированной высотой без адаптивного теста».

Сохраните исходные шаблоны/CSS, trace, скриншоты и контрольные действия. Меняйте одну причину за раз, чтобы изменение score можно было связать с правкой.

Пошаговая диагностика и исправление

  1. Сначала посмотрите field CLS для URL и origin отдельно по mobile/desktop; зафиксируйте период и 75-й перцентиль.
  2. В Performance запустите Record and reload, затем отдельную запись полного сценария: прокрутка, consent, формы, раскрытия, carousel.
  3. Откройте Layout shifts, выберите cluster с максимальным score и просмотрите каждый shift, affected nodes и potential culprit.
  4. Воспроизведите причину с отключённым кешем, медленной сетью и Layout Shift Regions; снимите moved from/to.
  5. Исправьте наиболее ранний общий источник, а не элемент, который только оказался сдвинут ниже.
  6. Повторите идентичные записи и соседние шаблоны, проверьте responsive layout, keyboard и zoom.
  7. После публикации отслеживайте field data: CrUX агрегируется со временем и не меняется сразу после релиза.

Решение по типу причины

Причина → безопасное исправление
ПричинаИсправлениеПроверка
Изображение/video/iframe без местаwidth/height, aspect-ratio, стабильный контейнерМесто видно до запроса media
Ad/embed неизвестной высотыЗарезервировать минимальный slot, адаптировать empty stateНет collapse при отсутствии рекламы
Web font меняет метрики текстаПодобрать fallback и font metric overrides, проверить displayСтроки не перепрыгивают после swap
Cookie/banner/message вставляется сверхуOverlay либо зарезервированная область с первого кадраКонтент не толкается поздней вставкой
Анимация меняет top/heighttransform/opacity, если подходитНет неожиданных layout-shift events

Техническое наблюдение

new PerformanceObserver(list => {
  for (const entry of list.getEntries()) {
    if (!entry.hadRecentInput) {
      console.log(entry.value, entry.startTime, entry.sources);
    }
  }
}).observe({ type: 'layout-shift', buffered: true });

Наблюдатель помогает воспроизвести сдвиги, но сам по себе не вычисляет полевой CLS пользователя и доступен не во всех браузерах одинаково. Основное доказательство — Performance trace с cluster и контекстом.

Не путайте ожидаемое движение с хорошим UX

Shift вскоре после ввода может не входить в CLS, но кнопка, которая уезжает, поздний accordion или резкий scroll всё равно могут мешать. Проверяйте задачу пользователя отдельно от score.

Откат и границы

При переполнении, обрезке или нарушении responsive layout верните прежний шаблон/CSS и очистите затронутый кеш. Не оставляйте огромный пустой slot только ради нулевого CLS. После исправления выполните независимую проверку.

Массовая разметка размеров изображений, оптимизация шрифтов, рекламная платформа, redesign и устранение других Core Web Vitals относятся к отдельным объёмам.