В браузерной среде объект document предоставляет
свойство visibilityState, которое отражает текущий
статус видимости страницы. Оно принимает одно из
следующих значений:
visible — страница полностью видима пользователю.hidden — страница скрыта, пользователь переключился на
другую вкладку, свернул окно или браузер перешёл в фоновый режим.prerender — страница находится в режиме
предварительного рендеринга (редко встречается).unloaded — страница выгружена (используется крайне
ограниченно).Это свойство критически важно для корректного измерения Web Vitals, потому что метрики, связанные с пользовательским опытом, зависят от того, видима страница или нет.
visibilityState на метрики Web VitalsLCP измеряет время, за которое основной контент страницы становится видимым. Если пользователь не видит страницу в момент рендеринга, браузер может откладывать отрисовку или приостанавливать некоторые вычисления, что приведёт к искажению LCP.
Особенности учёта LCP:
hidden), начисление LCP
приостанавливается, и значение обновляется только после
возврата в visible.visibilitychange используется для
корректной фиксации времени LCP, чтобы метрика отражала
именно видимую пользователю загрузку.FID измеряет задержку отклика страницы на первое взаимодействие пользователя. Если страница скрыта, пользователь не может взаимодействовать с ней, и FID:
CLS отражает суммарное смещение видимого контента. Проблемы могут возникнуть при:
hidden состоянии, фиксируя их только
когда visibilityState === 'visible'.visibilitychangeБраузеры предоставляют событие visibilitychange, которое
срабатывает при изменении состояния visibilityState. Его
можно использовать для:
Пример обработки:
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
// возобновление сбора метрик
} else {
// приостановка метрик, требующих видимости
}
});
Библиотека Web Vitals учитывает visibilityState при
сборе данных:
Пример корректного измерения LCP с учётом видимости:
import { getLCP } from 'web-vitals';
let lcpValue;
getLCP((metric) => {
if (document.visibilityState === 'visible') {
lcpValue = metric.value;
console.log('LCP видимой страницы:', lcpValue);
}
});
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible' && lcpValue) {
console.log('Страница снова видима, финальный LCP:', lcpValue);
}
});
Такой подход предотвращает неправильное занижение или завышение метрик из-за фонового состояния страницы.
visible
состоянии.visibilitychange для корректной
синхронизации событий с моментом, когда пользователь реально
видит страницу.visibilityStatevisibilityState — ключевой инструмент для правильного
измерения Web Vitals. Игнорирование его значений приводит к
искажённым метрикам, которые не отражают реальный
пользовательский опыт. Умение использовать visibilitychange
и фильтровать события по состоянию страницы обеспечивает
точность LCP, CLS и FID, особенно на страницах с
тяжелой загрузкой и большим количеством асинхронного контента.