Cumulative Layout Shift (CLS) измеряет визуальную стабильность страницы и фиксирует неожиданные смещения контента. Однако один только числовой показатель CLS не всегда позволяет понять причину изменений. Библиотека Web Vitals предоставляет инструмент CLSAttribution, позволяющий идентифицировать элементы, вызывающие смещения, и анализировать их вклад в итоговый показатель.
CLSAttribution строится на основе геометрической модели смещений. Каждое смещение элемента фиксируется как layout shift entry, содержащая следующие ключевые свойства:
x, y, width,
height);Важнейшая часть анализа — вычисление веса смещения, который определяется как отношение площади смещённой части контента к площади viewport. Формула:
impactFraction = (width * height элемента / ширина * высота viewport)
Полный вклад элемента в CLS учитывает также дистанцию смещения:
distanceFraction = (смещение по вертикали / высота viewport) + (смещение по горизонтали / ширина viewport)
Итоговый вклад элемента:
shiftScore = impactFraction * distanceFraction
Каждое смещение добавляется к общей сумме CLS. CLSAttribution позволяет сохранять детальную карту всех таких элементов и их вкладов, что делает анализ прозрачным.
Web Vitals предоставляет API для мониторинга CLS и получения информации о виновных элементах.
import {getCLS, CLSAttribution} from 'web-vitals';
getCLS((metric) => {
console.log('Общий CLS:', metric.value);
if (metric.attribution) {
metric.attribution.forEach((item) => {
console.log('Элемент:', item.node);
console.log('Вклад в CLS:', item.value);
console.log('Предыдущая позиция:', item.previousRect);
console.log('Текущая позиция:', item.currentRect);
});
}
});
Ключевые моменты:
metric.value — общий CLS на странице.metric.attribution — массив объектов
CLSAttributionEntry, содержащих геометрию смещений.node позволяет напрямую модифицировать CSS или
атрибуты элементов для предотвращения смещений.При разборе каждого элемента важно учитывать контекст смещения:
width/height приводит к неожиданным
изменениям.CLSAttribution позволяет визуализировать эти смещения через
координаты previousRect и currentRect. Это
особенно важно для страниц с динамическим контентом, где смещения
происходят после загрузки DOM.
Методы уменьшения CLS на основе данных CLSAttribution:
width и height.aspect-ratio для блоков с
динамическим контентом.Performance → Layout Shift Regions.CLSAttribution позволяет приоритизировать исправления по величине влияния элемента на итоговый CLS, что экономит время на оптимизацию.
Для страниц с большим количеством динамического контента полезно собирать подробную статистику CLS:
let clsEntries = [];
getCLS((metric) => {
if (metric.attribution) {
clsEntries.push(...metric.attribution);
}
});
// Позже можно агрегировать по селектору или тегу
const elementContributions = clsEntries.reduce((acc, item) => {
const selector = item.node.tagName;
acc[selector] = (acc[selector] || 0) + item.value;
return acc;
}, {});
Это позволяет выявить наиболее проблемные типы элементов на сайте и построить план оптимизации по приоритету.
CLSAttribution работает не просто с числовыми значениями CLS, а с реальной геометрией элементов, что позволяет:
Эта модель становится особенно критичной для адаптивных и responsive интерфейсов, где элементы могут менять размер и позицию в зависимости от ширины экрана.