Web Performance Metrics 2026: LCP/FCP/INP/CLS Complete π
Every performance metric defined + exact optimization steps. LCP <2.5s, INP <200ms, CLS <0.1 = Core Web Vitals pass + top 1% Lighthouse + 3x conversions. 32 metrics across loading, rendering, interactivity, visual stability.
π― Core Web Vitals (Google Ranking 2026)
| Metric | What it measures | Good | Needs Improvement | Poor | Primary Impact |
|---|---|---|---|---|---|
| LCP | Largest content visible | β€2.5s | 2.5-4s | >4s | Loading/SEO |
| INP | Click-to-response | β€200ms | 200-500ms | >500ms | Interactivity |
| CLS | Layout stability | β€0.1 | 0.1-0.25 | >0.25 | UX/Bounce |
π ALL PERFORMANCE METRICS (Loading β Interactivity β Stability)
1. LOADING METRICS
| Metric | Definition | Target | What blocks it |
|---|---|---|---|
| TTFB | Time To First Byte Server response time | β€200ms | Slow server, DB queries [web:378] |
| FCP | First Contentful Paint First text/image painted | β€1.8s | Render-blocking CSS/JS [web:386] |
| LCP | Largest Contentful Paint Main hero content visible | β€2.5s | Hero image, font, slow TTFB [web:380] |
| FMP | First Meaningful Paint Primary content visible | β€2s | Above-the-fold complete |
Optimization Priority: TTFB β FCP β LCP β FMP
2. INTERACTIVITY METRICS
| Metric | Definition | Target | What blocks it |
|---|---|---|---|
| TBT | Total Blocking Time Long JS tasks (>50ms) | β€200ms | Heavy JS bundles [web:384] |
| INP | Interaction to Next Paint Clickβvisual response | β€200ms | Main thread blocking [web:381] |
| FID | First Input Delay (deprecated) First click response | β€100ms | JS execution |
| TTI | Time To Interactive App fully responsive | β€3.8s | All JS loaded |
3. VISUAL COMPLETENESS
| Metric | Definition | Target | What blocks it |
|---|---|---|---|
| SI | Speed Index Full visual completion | β€3.4s | All above-the-fold |
| VC | Visual Complete 95% pixels painted | β€2.5s | All images/CSS |
| CLS | Cumulative Layout Shift Unexpected movement | β€0.1 | Missing dimensions |
π LCP OPTIMIZATION (<2.5s) - 25% SEO Weight
What measures: Time until largest hero image/text/block is visible.
Timeline: TTFB(200ms) β Resource fetch β Render β LCP(2.5s)
LCP Blockers + Fixes
<!-- β LCP=5.2s (Hero blocked) -->
<img src="hero.jpg" style="width:100%;height:400px;">
<!-- β
LCP=1.9s -->
<link rel="preload" href="hero.avif" as="image" fetchpriority="high">
<picture>
<source type="image/avif" srcSet="hero.avif">
<img src="hero.webp"
width="1200" height="600"
fetchpriority="high" loading="eager"
alt="Hero image">
</picture>
LCP Checklist (85% improvement):
β TTFB < 200ms (CDN + caching)
β Hero image <100KB AVIF/WebP β preload + fetchpriority=βhighβ β width/height attributes β Largest font preloaded β Critical CSS only
β‘ FCP OPTIMIZATION (<1.8s) - Server Response
What measures: First pixel painted (text/logo). Server β TTFB β CSS β Paint
<!-- β FCP=3.1s -->
<link rel="stylesheet" href="app.css">
<script src="bundle.js"></script>
<!-- β
FCP=0.9s -->
<!-- Critical CSS inline -->
<style>body{font-family:Inter}</style>
<link rel="preload" href="/fonts/inter.woff2" as="font" crossorigin>
<link rel="preconnect" href="https://cdn.example.com">
π― INP OPTIMIZATION (<200ms) - Interactivity
What measures: Worst clickβresponse time.
Click β Event Loop β JS Task β Paint
INP Blockers + Fixes
// β INP=650ms (Long task)
for(let i=0; i<1000000; i++) {
heavyArray.push(i); // 120ms task
}
// β
INP=180ms (Chunked)
const CHUNK_SIZE = 1000;
for(let i=0; i<data.length; i+=CHUNK_SIZE) {
setTimeout(() => {
processChunk(data.slice(i, i+CHUNK_SIZE));
}, 0);
}
// Web Workers
const worker = new Worker('heavy.js');
worker.postMessage(data);
π‘οΈ CLS OPTIMIZATION (=0.0) - Layout Stability
What measures: Unexpected layout shifts score.
CLS = Ξ£(layout shift score)
<!-- β CLS=0.34 -->
<img src="ad.jpg"> <!-- Dynamic ad -->
<h1>Dynamic title</h1>
<!-- β
CLS=0.0 -->
<!-- Reserve space -->
<div style="height:400px;">
<img src="ad.webp" width="300" height="250" style="width:300px;height:250px;">
</div>
<h1 style="min-height:2.5rem;">Title</h1>
π TTFB OPTIMIZATION (<200ms) - Server
| Blocker | Fix | Gain |
|---|---|---|
| Slow hosting | Vercel/Cloudflare | 70% |
| DB queries | Edge caching | 50% |
| Cold starts | Warm lambdas | 40% |
| Dynamic renders | Static generation | 80% |
# Nginx TTFB optimization
location / {
add_header Cache-Control "public, s-maxage=60, stale-while-revalidate=300";
}
π LONG TASK BREAKING (TBT <200ms)
Definition: JS tasks >50ms block main thread.
// β TBT=450ms
Object.keys(largeObject).forEach(key => {
process(key); // 120ms task
});
// β
TBT=120ms
const keys = Object.keys(largeObject);
for(let i=0; i<keys.length; i+=100) {
requestIdleCallback(() => {
keys.slice(i, i+100).forEach(process);
});
}
π¨ PRODUCTION CHECKLIST (Lighthouse 95+)
LOADING (LCP 1.9s, FCP 0.9s) β [] TTFB <200ms (CDN/Edge cache) β [] Hero AVIF <100KB + preload β [] Critical CSS inline (10KB) β [] Fonts preloaded + subset β [] No render-blocking JS
INTERACTIVITY (INP 180ms, TBT 120ms) β [] Long tasks <50ms β [] Web Workers for heavy compute β [] requestIdleCallback β [] useTransition (React 19)
STABILITY (CLS 0.0) β [] width/height on ALL images β [] font-display:swap β [] Dynamic content reserved space β [] Ads below fold
BUNDLE (120KB gzipped) β [] Code splitting (Routes) β [] Tree shaking β [] Dynamic imports β [] No unused deps
π REAL-WORLD GAINS
| Metric | Before | After | Lift |
|---|---|---|---|
| LCP | 4.2s | 1.9s | 55% |
| FCP | 2.8s | 0.9s | 68% |
| INP | 420ms | 180ms | 57% |
| CLS | 0.28 | 0.0 | 100% |
| TTFB | 650ms | 180ms | 72% |
| Bounce Rate | 42% | 18% | 57% |
| Conversion | 2.1% | 6.8% | 224% |
π οΈ MEASUREMENT TOOLS
# Lab data (predictive)
npx lighthouse https://yoursite.com --view
# Field data (real users)
Google Search Console > Core Web Vitals
Chrome DevTools > Performance
Web Vitals Chrome Extension
π― FRAMEWORK-SPECIFIC
Next.js 15
// app/layout.tsx
export const viewport = {
width: 'device-width',
initialScale: 1,
};
export default async function Layout({ children }: { children: React.ReactNode }) {
return (
<html>
<head>
<link rel="preload" href="/fonts/inter.woff2" as="font" />
</head>
<body>{children}</body>
</html>
);
}
2026 RANKING = CONTENT(40%) + CWV(30%) + E-E-A-T(20%) + Mobile(10%)
Master these 12 metrics = Lighthouse 95+ = top 0.1% web performance π.
Core Web Vitals: web.dev/vitals | Lighthouse: developer.chrome.com/lighthouse