Core Web Vitals remain a key Google ranking factor in 2026. With the introduction of INP (Interaction to Next Paint), which fully replaced FID, website interactivity requirements have become even stricter. This guide covers the current metrics, measurement methods, and practical ways to optimize them.
What are Core Web Vitals in 2026?
Core Web Vitals are a set of Google metrics that evaluate the real user experience on a website. In 2026, there are three current core metrics:
LCP (Largest Contentful Paint)
The time it takes to render the largest visible element on the page.
- Good: ≤ 2.5 seconds
- Needs improvement: 2.5 – 4 seconds
- Poor: > 4 seconds
INP (Interaction to Next Paint)
Replaced FID in March 2024. It measures the delay between a user action and the visual response of the interface.
- Good: ≤ 200 ms
- Needs improvement: 200 – 500 ms
- Poor: > 500 ms
CLS (Cumulative Layout Shift)
Cumulative layout shift measures the visual stability of a page.
- Good: ≤ 0.1
- Needs improvement: 0.1 – 0.25
- Poor: > 0.25
How to measure Core Web Vitals
Lab tools
# Lighthouse в Chrome DevTools
# F12 → Lighthouse → Analyze page load
# PageSpeed Insights API
curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=YOUR_URL&strategy=mobile"Field data (RUM)
Real user data from the Chrome UX Report (CrUX):
// Web Vitals JavaScript библиотека
import { onLCP, onINP, onCLS } from 'web-vitals';
onLCP(console.log);
onINP(console.log);
onCLS(console.log);reChecker Web Vitals
Use the Web Vitals tool on reChecker to quickly check any website without installing extensions.
Optimizing LCP
1. Image optimization
<!-- Используйте современные форматы -->
<picture>
<source srcset="hero.avif" type="image/avif">
<source srcset="hero.webp" type="image/webp">
<img src="hero.jpg" alt="Hero image" fetchpriority="high">
</picture>2. Preloading critical resources
<head>
<!-- Предзагрузка LCP-изображения -->
<link rel="preload" as="image" href="/hero.webp" fetchpriority="high">
<!-- Предзагрузка шрифтов -->
<link rel="preload" as="font" href="/fonts/main.woff2"
type="font/woff2" crossorigin>
</head>3. Server optimization
# Nginx: включение сжатия и кэширования
gzip on;
gzip_types text/plain text/css application/json application/javascript;
location ~* \.(jpg|jpeg|png|webp|avif|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}Optimizing INP
INP is the most difficult metric to optimize. It measures responsiveness to ALL user interactions.
1. Breaking up long tasks
// Плохо: блокирующая операция
function processLargeArray(items) {
items.forEach(item => heavyComputation(item));
}
// Хорошо: разбивка на чанки с yield
async function processLargeArrayOptimized(items) {
const chunkSize = 100;
for (let i = 0; i < items.length; i += chunkSize) {
const chunk = items.slice(i, i + chunkSize);
chunk.forEach(item => heavyComputation(item));
// Даём браузеру "вздохнуть"
await scheduler.yield();
}
}2. Using scheduler.yield()
In 2026, scheduler.yield() is supported by all modern browsers:
async function handleClick() {
// Первый этап — немедленный визуальный отклик
showLoadingState();
await scheduler.yield();
// Второй этап — тяжёлые вычисления
const result = await processData();
await scheduler.yield();
// Третий этап — обновление UI
updateUI(result);
}3. Optimizing event handlers
// Плохо: тяжёлая логика в обработчике
button.addEventListener('click', () => {
const data = expensiveCalculation();
renderChart(data);
});
// Хорошо: отложенная обработка
button.addEventListener('click', () => {
// Мгновенный визуальный отклик
button.classList.add('loading');
// Отложенная тяжёлая работа
requestIdleCallback(() => {
const data = expensiveCalculation();
renderChart(data);
button.classList.remove('loading');
});
});Optimizing CLS
1. Reserving space for images
<!-- Всегда указывайте размеры -->
<img src="photo.jpg" width="800" height="600" alt="Photo">
<!-- Или используйте aspect-ratio -->
<style>
.image-container {
aspect-ratio: 16 / 9;
width: 100%;
}
</style>2. Preventing FOUT/FOIT
/* Оптимальная загрузка шрифтов */
@font-face {
font-family: 'CustomFont';
src: url('/fonts/custom.woff2') format('woff2');
font-display: optional; /* или swap для важных шрифтов */
}3. Reserving space for dynamic content
/* Фиксированная высота для рекламных блоков */
.ad-container {
min-height: 250px;
contain: layout;
}
/* Skeleton loading */
.skeleton {
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
}Production monitoring
Setting up metric reporting
import { onLCP, onINP, onCLS } from 'web-vitals';
function sendToAnalytics(metric) {
const body = JSON.stringify({
name: metric.name,
value: metric.value,
rating: metric.rating,
delta: metric.delta,
id: metric.id,
page: window.location.pathname,
});
// Используем sendBeacon для надёжной отправки
navigator.sendBeacon('/api/analytics', body);
}
onLCP(sendToAnalytics);
onINP(sendToAnalytics);
onCLS(sendToAnalytics);Core Web Vitals optimization checklist
LCP
- Images in AVIF/WebP formats
- Preload the LCP element
- CDN for static assets
- Server-side caching
- Optimize TTFB < 800ms
INP
- No long tasks > 50ms
- Use scheduler.yield()
- Virtualize long lists
- Code splitting for JavaScript
- Web Workers for heavy computations
CLS
- Dimensions specified for all images
- Space reserved for ads
- font-display: optional/swap
- No dynamic content inserted above the viewport
Conclusion
Core Web Vitals in 2026 are not just a ranking factor, but also a measure of user experience quality. Pay special attention to INP — this metric often suffers because of heavy JavaScript. Use reChecker Web Vitals for regular monitoring, and remember to check real data from CrUX.
Remember: optimizing Core Web Vitals is an investment in conversions and user retention, not just SEO.