The six Core Web Vitals fixes that deliver measurable ranking lifts, in priority order: (1) preload the hero image, (2) set explicit width/height on every image to prevent layout shift, (3) serve modern image formats (WebP/AVIF) at the right size, (4) defer non-critical JavaScript, (5) preload web fonts with font-display: swap, and (6) remove render-blocking CSS. Applied together, these typically move LCP from 4s+ to under 2.5s, CLS from 0.25+ to under 0.1, and INP from 300ms+ to under 200ms — enough to lift most sites from CWV-failing to CWV-passing.
Why CWV matters (and how much)
Core Web Vitals became a direct Google ranking signal in 2021 and strengthened through 2025. In competitive Malaysian SERPs, two comparable sites will often differentiate on CWV alone — and the passing site wins. More importantly, CWV correlates with real user behaviour: slow sites bounce faster, shift-heavy sites frustrate, janky sites convert worse. Fixing CWV is both an SEO play and a conversion play.
The three metrics in plain English
- LCP (Largest Contentful Paint) — how long until the biggest above-the-fold element (usually a hero image or headline) renders. Target: < 2.5s.
- CLS (Cumulative Layout Shift) — how much the page jumps around as it loads. Target: < 0.1.
- INP (Interaction to Next Paint) — how long until the page responds when you click or tap. Target: < 200ms.
Fix 1: preload the hero image
LCP is almost always decided by the hero image. If the browser discovers the hero only after parsing the CSS and layout tree, you've already lost a second. Add this to the page head: <link rel="preload" as="image" href="/images/hero.webp">. This alone often drops LCP by 600–1200ms.
Fix 2: explicit width/height on every image
Browser doesn't know an image's size until it downloads — unless you tell it. Always specify <img src="…" width="1200" height="800" alt="…">. This reserves space for the image in layout, eliminating the shift when it finally loads. Single biggest CLS fix. Works with CSS max-width: 100%; height: auto; to keep the image responsive.
Fix 3: modern image formats, right size
A 3000px JPEG hero displayed at 800px costs 4x the bytes it needs. WebP at the actual display size is typically 60–80% smaller than the JPEG source. Add AddType image/webp .webp to .htaccess, and serve images at approximately the dimensions they render at — with loading="lazy" decoding="async" for below-fold images.
Fix 4: defer non-critical JavaScript
Analytics, chat widgets, social embeds, ad pixels — everything except critical-path JS — should load with defer or async attributes. On INP, this is enormous. If a third-party script is blocking INP and you can't remove it, consider loading it on user interaction instead of on page load.
Fix 5: font loading
Web fonts block text rendering unless configured. Two moves: Preload with <link rel="preload" as="font" type="font/woff2" href="…" crossorigin>, and use font-display: swap so text renders in fallback immediately and swaps when the custom font arrives. This costs you an FOUT (flash of unstyled text) but gains you text-visible-before-font-loads — a better LCP almost always outweighs the momentary style swap.
Fix 6: remove render-blocking CSS
One large CSS file blocks rendering until it downloads and parses. Two strategies: Inline critical CSS — embed the above-the-fold CSS directly in the page head, async-load the rest; or Split and load per-route — ship only the CSS that page needs. For most PHP-served sites, inlining critical CSS plus <link rel="stylesheet" media="print" onload="this.media='all'"> for the full stylesheet gets you 90% of the benefit with 10% of the complexity.
The before/after we usually see
On Malaysian SME sites we've migrated to this stack, typical field-data lifts:
- LCP: 3.8s → 1.7s
- CLS: 0.28 → 0.04
- INP: 280ms → 140ms
Google Search Console status: from "Needs improvement" to "Good". Ranking impact over the subsequent 2–4 weeks is typically noticeable on previously-borderline pages.
What NOT to bother with
A short list of things people obsess over that don't move CWV: minifying HTML (browser gzip handles it), shaving 5ms off a single CSS rule, running a dozen PageSpeed "opportunities" that save 0.1s each, switching CDNs when the bottleneck is application-level. Focus on the six fixes above. Measure field data, not lab scores. Iterate.