Toolypet
Back to Blog
SEO

Complete Core Web Vitals Guide 2026 - Page Experience Optimization

Understanding LCP, INP, CLS metrics and optimization methods. Practical guide to improve Core Web Vitals, a Google ranking factor.

Toolypet Team

Toolypet Team

Development Team

8 min read

Complete Core Web Vitals Guide 2026

"The site was too slow, so I left"

53% of users leave the page if loading takes more than 3 seconds. Google introduced Core Web Vitals to reflect this user experience in rankings.

As of 2026, Core Web Vitals is a key ranking factor for mobile SEO.


What are Core Web Vitals?

Core Web Vitals are 3 key metrics that measure user experience.

2026 Metrics

MetricMeasuresGoodNeeds ImprovementPoor
LCPLoading speed≤2.5s≤4s>4s
INPInteraction response≤200ms≤500ms>500ms
CLSVisual stability≤0.1≤0.25>0.25

Metric Change (2024)

FID (First Input Delay) → INP (Interaction to Next Paint)

FID: Only measured first input
INP: Measures responsiveness of all interactions (more comprehensive)

LCP (Largest Contentful Paint)

Definition

The time it takes for the largest content element on the page to render on screen

Elements Measured

ElementExample
<img>Hero image
<video> posterVideo thumbnail
CSS background-imageBackground image
Text blocks<h1>, <p>, etc.

Optimization Methods

1. Image Optimization

<!-- ❌ Slow -->
<img src="hero.png" alt="Hero">

<!-- ✅ Optimized -->
<img
  src="hero.webp"
  srcset="hero-400.webp 400w, hero-800.webp 800w"
  sizes="(max-width: 600px) 400px, 800px"
  alt="Hero"
  loading="eager"
  fetchpriority="high"
>

2. Server Response Time (TTFB)

Target: TTFB < 200ms

Improvement methods:
- Use CDN
- Server-side caching
- Database query optimization
- HTTP/2 or HTTP/3

3. Remove Render-Blocking Resources

<!-- ❌ Render blocking -->
<link rel="stylesheet" href="styles.css">
<script src="app.js"></script>

<!-- ✅ Optimized -->
<link rel="stylesheet" href="critical.css">
<link rel="preload" href="styles.css" as="style" onload="this.rel='stylesheet'">
<script src="app.js" defer></script>

4. Inline Critical CSS

<head>
  <style>
    /* Only CSS needed for first screen */
    .hero { ... }
    .header { ... }
  </style>
  <link rel="preload" href="full.css" as="style">
</head>

5. Preload Hints

<head>
  <!-- Preload LCP image -->
  <link rel="preload" href="hero.webp" as="image" fetchpriority="high">

  <!-- Preload web fonts -->
  <link rel="preload" href="font.woff2" as="font" crossorigin>
</head>

INP (Interaction to Next Paint)

Definition

The time from user interaction (click, tap, key press) to the next screen update

Difference from FID

FIDINP
First input onlyAll interactions
Input delay onlyTotal response time
Deprecated 2024Replaced March 2024

What's Measured

  • Clicks (mouse, touch)
  • Key presses
  • Taps (mobile)

Optimization Methods

1. Prevent Main Thread Blocking

// ❌ Main thread blocking
function heavyTask() {
  for (let i = 0; i < 1000000; i++) {
    // Heavy computation
  }
}

// ✅ Split into chunks
async function heavyTaskChunked() {
  const chunks = splitIntoChunks(data, 1000);
  for (const chunk of chunks) {
    processChunk(chunk);
    await new Promise(r => setTimeout(r, 0)); // Yield
  }
}

2. Debounce/Throttle

// ❌ Execute every time
input.addEventListener('input', search);

// ✅ Debounce
input.addEventListener('input', debounce(search, 300));

3. Use Web Workers

// Main thread
const worker = new Worker('worker.js');
worker.postMessage(data);
worker.onmessage = (e) => updateUI(e.data);

// worker.js
self.onmessage = (e) => {
  const result = heavyComputation(e.data);
  self.postMessage(result);
};

4. Optimize Event Handlers

// ❌ Heavy handler
button.onclick = () => {
  computeData();      // Heavy
  updateDOM();        // DOM manipulation
  sendAnalytics();    // Network
};

// ✅ Async separation
button.onclick = async () => {
  requestAnimationFrame(() => {
    updateDOM();      // Quick UI update first
  });

  await computeDataAsync();
  sendAnalytics();    // Later
};

5. Reduce Script Size

// Code splitting
const Modal = React.lazy(() => import('./Modal'));

// Tree shaking
import { specific } from 'library'; // Avoid full import

CLS (Cumulative Layout Shift)

Definition

Cumulative score of unexpected layout shifts during page load

Problem Scenario

User: About to click a button
Ad loads: Layout shifts
Result: Clicks wrong button

Optimization Methods

1. Specify Image/Video Dimensions

<!-- ❌ No dimensions (causes CLS) -->
<img src="photo.jpg" alt="Photo">

<!-- ✅ Specify dimensions -->
<img src="photo.jpg" alt="Photo" width="800" height="600">

<!-- ✅ Use aspect-ratio -->
<img src="photo.jpg" alt="Photo" style="aspect-ratio: 4/3; width: 100%;">

2. Reserve Space for Ads/Embeds

/* Pre-reserve ad space */
.ad-slot {
  min-height: 250px;
  background: #f0f0f0;
}

/* Or use aspect-ratio */
.video-embed {
  aspect-ratio: 16/9;
  width: 100%;
}

3. Web Font Optimization

/* ❌ Causes FOUT/FOIT */
@font-face {
  font-family: 'Custom';
  src: url('font.woff2');
}

/* ✅ Use font-display */
@font-face {
  font-family: 'Custom';
  src: url('font.woff2');
  font-display: swap; /* or optional */
}
<!-- Preload fonts -->
<link rel="preload" href="font.woff2" as="font" crossorigin>

4. Handle Dynamic Content

// ❌ Sudden insertion
container.innerHTML = newContent;

// ✅ Reserve space before insertion
container.style.minHeight = '200px';
container.innerHTML = newContent;
/* Or set min-height in CSS */
.dynamic-content {
  min-height: 200px;
}

5. Use Transform Animations

/* ❌ Triggers layout */
.element {
  animation: slide 0.3s;
}
@keyframes slide {
  from { top: -100px; }
  to { top: 0; }
}

/* ✅ Use transform (no layout shift) */
@keyframes slide {
  from { transform: translateY(-100px); }
  to { transform: translateY(0); }
}

Measurement Tools

Field Data (Real Users)

ToolData SourceFeatures
Chrome UX ReportChrome users28-day aggregation
Search ConsoleCrUX basedGoogle official
PageSpeed InsightsCrUX + LighthouseReal-time analysis

Lab Data (Simulation)

ToolPurpose
LighthouseBuilt into Chrome DevTools
WebPageTestDetailed analysis, comparison testing
GTmetrixVisual reports

Chrome DevTools

1. F12 (Developer Tools)
2. Performance tab
3. Record → Refresh page
4. Check Web Vitals section

Framework-Specific Optimization

Next.js

// next.config.js
module.exports = {
  images: {
    formats: ['image/avif', 'image/webp'],
  },
  experimental: {
    optimizeCss: true,
  },
};

// Component
import Image from 'next/image';

export default function Hero() {
  return (
    <Image
      src="/hero.jpg"
      alt="Hero"
      width={1200}
      height={600}
      priority // LCP image
      placeholder="blur"
    />
  );
}

React

// Code splitting
const HeavyComponent = React.lazy(() => import('./HeavyComponent'));

// Suspense
<Suspense fallback={<Skeleton />}>
  <HeavyComponent />
</Suspense>

Vanilla JavaScript

<!-- Script loading -->
<script src="critical.js"></script>
<script src="app.js" defer></script>
<script src="analytics.js" async></script>

<!-- Lazy load images -->
<img src="below-fold.jpg" loading="lazy" alt="Below fold">

Improvement Priority

By Impact

RankOptimization ItemEffect
1LCP image optimizationLCP ↓
2Remove render-blocking JSLCP, INP ↓
3Specify image/embed dimensionsCLS ↓
4Use CDNLCP ↓
5Web font optimizationCLS ↓
6JS bundle splittingINP ↓

Quick Wins

<!-- 1. Preload LCP image -->
<link rel="preload" href="hero.webp" as="image">

<!-- 2. Specify image dimensions -->
<img width="800" height="600" ...>

<!-- 3. JS defer -->
<script src="app.js" defer></script>

FAQ

Q1: How much does Core Web Vitals affect rankings?

A: It's a direct ranking factor, but not more important than content quality. It plays a decisive role when content quality is similar between competing pages.

Q2: Why are mobile and desktop scores different?

A: Google primarily uses mobile data. Prioritize mobile optimization.

Q3: Why does it show "No data"?

A: There's insufficient traffic data in Chrome UX Report. The site may have low traffic or be new.

Q4: Which metric should I improve first?

A: Generally:

  1. LCP - Most noticeable improvement
  2. CLS - Reduces user frustration
  3. INP - Important for interaction-heavy sites

Q5: What if third-party scripts are the problem?

A:

  • Remove unnecessary scripts
  • Use async or defer attributes
  • Use Web Worker libraries like Partytown

Checklist

LCP Optimization

  • Preload LCP image
  • Image optimization (WebP/AVIF)
  • Remove render-blocking resources
  • TTFB < 200ms
  • Use CDN

INP Optimization

  • Split heavy JS chunks
  • Apply debounce/throttle
  • Remove unnecessary JS
  • Clean up third-party scripts

CLS Optimization

  • Specify image/video dimensions
  • Reserve ad space
  • Set font-display
  • Reserve space for dynamic content

Conclusion

Core Web Vitals Essentials:

  1. LCP ≤ 2.5s: Render largest content quickly
  2. INP ≤ 200ms: Respond instantly to interactions
  3. CLS ≤ 0.1: No layout shifts

Mobile optimization is key.


Related Tools

ToolPurpose
PageSpeed AnalyzerMeasure Core Web Vitals
Image OptimizerWebP conversion
Meta Tag GeneratorSEO meta tags
Core Web VitalsLCPINPCLSPage SpeedSEOPerformance Optimization

About the Author

Toolypet Team

Toolypet Team

Development Team

The Toolypet Team creates free, privacy-focused web tools for developers and designers. All tools run entirely in your browser with no data sent to servers.

Web DevelopmentCSS ToolsDeveloper ToolsSEOSecurity