How to Achieve 100/100 Core Web Vitals Without Sacrificing Visual Design
LCP, CLS and INP are the lab-based metrics Google uses to judge user experience. This guide shows how to hit perfect scores while keeping the modern, animated, conversion-focused design clients actually want.
KEY TAKEAWAYS
- Optimize LCP by preloading the hero image and eliminating render-blocking CSS and font swaps.
- Fix CLS by reserving space for images, ads and web fonts with explicit aspect-ratio and font-display.
- INP improves when you break long tasks, keep the main thread free and favour passive listeners.
- Lab scores and field data (CrUX) both matter — target 90+ lab and 75th-percentile field thresholds.
- You can keep rich interaction and micro-animations; the trick is constraining their cost.
What Core Web Vitals Actually Measure
Google replaced the old coarse page-speed signals with three user-centric metrics in the Web Vitals programme, and they became a ranking factor in June 2021. The pass thresholds are:
- Largest Contentful Paint (LCP) — when the biggest visible content element finishes loading. Target: under 2.5 s.
- Cumulative Layout Shift (CLS) — how much the page visually jumps as assets load. Target: under 0.1.
- Interaction to Next Paint (INP) — responsiveness to the last user interaction. Target: under 200 ms. INP replaced FID in March 2024.
The hard part is that performance work usually feels like it fights the visual design. Landing pages want big imagery, webfonts and motion — exactly the elements that hurt scores. This guide shows how to keep both.
1. Optimize LCP Without Downgrading the Hero
The hero image is almost always the LCP element. Three steps make it load in well under a second regardless of its size.
Step 1 — preload and fetchpriority. Tell the browser the hero is the priority resource before it parses the CSS:
<link rel="preload" as="image" fetchpriority="high" href="/assets/hero-home.webp">Step 2 — serve AVIF or WebP with an explicit dimension block so nothing shifts while it loads:
<img src="/assets/hero-home.webp" alt="Kitchen interior" width="1440" height="810" fetchpriority="high">Step 3 — eliminate the LCP element entirely in the worst cases. If the design allows, render a styled gradient or the brand as the LCP element instead of a photographic image. The LCP then paints with CSS in a single frame.
Combined, these changes routinely move LCP from 3.5 s to 0.9 s. We apply the same pattern across the entire site during our technical SEO audits.
2. Kill Layout Shift (CLS) Before It Kills Rankings
Layout shift happens when the browser discovers an element’s dimensions only after it has already painted. Reserve space for everything:
img, video { aspect-ratio: attr(width) / attr(height); }
.ads-box { width: 100%; height: 250px; /* fixed slot */ }For webfonts, the biggest hidden CLS source, use font-display: swap plus matching fallbacks with identical metrics:
@font-face {
font-family: "Space Grotesk";
font-display: swap;
src: url("/fonts/space-grotesk.woff2") format("woff2");
}Measure CLS with the LayoutShiftObserver API during development so a regression is caught in CI, not in Search Console. A stable page keeps CLS at 0.00 while a lazy-loading banner or unset carousel can push it to 0.35 in a single bad commit.
3. Tame INP with Main-Thread Discipline
INP is scored from the longest interaction’s response delay. Three concrete techniques:
- Break long tasks with
setTimeout(..., 0)or the scheduler API so parsing work never blocks an input event. - Defer non-critical JS to
requestIdleCallbackand only hydrate what is visible. - Use passive listeners for scroll and touch so the browser never waits on
preventDefault():
window.addEventListener('scroll', updateProgress, { passive: true });The largest wins come from removing heavy third-party widgets from the main thread. Analytics, chat widgets and embedded maps often account for 60% of total blocking time on marketing sites — most of it unmeasurable value. If a visual is worth its weight, it is worth a dedicated performance-optimized build.
4. Animation Can Stay — If It Stays Off the Layout Thread
Animations only hurt scores when they trigger layout or paint. Transform and opacity changes run on the compositor and never block the main thread:
.reveal {
opacity: 0;
transform: translateY(24px);
transition: opacity .6s var(--ease), transform .6s var(--ease);
will-change: transform;
}
.reveal.is-visible { opacity: 1; transform: none; }This exact pattern powers the scroll reveals on our own marketing site — the design feels animated while CLS stays 0.00. The rule: never animate top, left, margin or height. Always animate transform and opacity.
5. Field Data Is the Score That Counts
Lighthouse is a deterministic lab proxy. Google ranks on field data — the 75th percentile of real users in the Chrome UX Report. Match both:
- Lab: Lighthouse Performance 99+ on a mid-range mobile profile.
- Field: LCP < 2.5 s, CLS < 0.1, INP < 200 ms at the p75.
Field data lags by ~28 days, so audit with lab now, ship the fix, and watch Search Console. We bake all three metrics into our website development pipeline so new pages ship fast and stay fast.
Frequently Asked Questions
Can a visually rich site still score 100/100 on Core Web Vitals?
Yes. The visual cost comes from unconstrained assets, not from richness itself. Preloaded hero media, font-display: swap, explicit dimensions and compositor-only animation let you keep the design while scoring green.
Which metric is hardest to fix in production?
For most custom sites it is INP, because it depends on runtime JavaScript triggered by interactions. Fix LCP and CLS first, then address INP with task splitting and fewer third-party scripts.
Do I need lab 100 or is field data what matters?
Both. Lab is a deterministic proxy that catches obvious mistakes; field data from CrUX is what Google weights. Target 90+ lab and 75th-percentile field.
Should I preload every image?
No. Preload only the largest above-the-fold image. Preloading everything inflates bandwidth and hurts LCP. Reserve space for everything else with width and height attributes.
Get Your Free Website Audit
Tell us about your business and get a complete analysis within 24 hours. No obligation, 100% free.
- Complete website & SEO analysis
- What's holding you back, in plain English
- Actionable fixes you can use either way
- Response within 24 hours, Mon-Sat
Scores Below 90 Are Losing You Rankings
Get a full lab + field performance audit with fixes prioritized by business impact — free, no obligation.