Fix LCP by making the main thing on the page load first. In most cases, that means your hero image, main headline, product photo, or video poster. If that element is late, your page feels slow. No amount of fancy animation will save it.
TLDR: Largest Contentful Paint should land in 2.5 seconds or less. Start by finding the LCP element, then preload it, shrink it, and remove anything blocking it. For example, an online store that cut its LCP from 4.1s to 1.9s saw mobile sales rise by 12% in six weeks. That is not magic. That is fewer people giving up.
What LCP Means in Plain English
Largest Contentful Paint, or LCP, measures when the biggest visible content element appears in the viewport. It is one of Google’s Core Web Vitals. It also matches real life pretty well.
If users open a page and stare at a blank box, they get annoyed. If they see the main content fast, they relax. Simple.
Your LCP element is often one of these:
- A large hero image.
- A product image.
- A big text block or heading.
- A video poster image.
- A background image loaded with CSS.
The goal for 2026 is still clear:
- Good: 2.5 seconds or less.
- Needs work: 2.5 to 4 seconds.
- Poor: over 4 seconds.
Honestly, it feels like some sites hide the main image in a maze of scripts. Then everyone wonders why the page crawls. Do not do that.
Step 1: Find the Real LCP Element
Do not guess. Guessing wastes time.
Use tools like:
- Chrome DevTools Performance panel.
- PageSpeed Insights.
- Lighthouse.
- CrUX data for real user data.
- WebPageTest for filmstrip views.
Look for the item marked as the LCP element. Then ask one brutal question:
Why did this take so long to show up?
The answer is usually one of these: the server was slow, the image was too big, CSS blocked rendering, JavaScript took over the page, or the browser did not know the image mattered.
Step 2: Make the Server Respond Faster
LCP starts with the first byte. If your server takes 1.2 seconds to answer, you already burned half the budget.
Aim for a fast Time to First Byte. Under 800 ms is a solid target. Faster is better.
Try these fixes:
- Use full-page caching for public pages.
- Serve pages from a CDN close to users.
- Remove slow database calls from the first request.
- Use edge rendering where it makes sense.
- Compress HTML with Brotli or Gzip.
- Send 103 Early Hints for key assets.
The catch is that slow hosting can make every other fix feel useless. You can compress images all day. If the server naps first, users still wait.
Step 3: Give the LCP Image VIP Treatment
If your LCP element is an image, treat it like a celebrity. No queue. No delay. No “maybe later.”
Use preload for the main image:
<link rel="preload" as="image" href="/hero.avif" fetchpriority="high">
Add fetchpriority=”high” to the image itself:
<img src="/hero.avif" width="1200" height="700" fetchpriority="high" alt="Product dashboard">
Also, do not lazy load the LCP image. Lazy loading is great for images below the fold. It is terrible for the main image users need right now.
Use modern formats:
- AVIF for strong compression.
- WebP as a safe fallback.
- JPEG only when needed.
Set proper sizes too:
<img
src="hero 1200.avif"
srcset="hero 600.avif 600w, hero 1200.avif 1200w"
sizes="100vw"
width="1200"
height="700"
alt="Fast checkout screen">
This stops phones from downloading giant desktop images. It sounds obvious. Yet it still happens all the time.
Step 4: Stop CSS From Blocking the Party
Browsers need CSS before they can paint the page. Too much CSS can delay LCP.
Keep critical CSS small. Inline the styles needed for the top of the page. Load the rest later.
Good moves include:
- Remove unused CSS.
- Split CSS by route or template.
- Inline above-the-fold styles.
- Avoid huge CSS frameworks if you use only 8% of them.
- Minify CSS.
It drives me crazy when a page downloads 240 KB of CSS just to show a title, button, and image. That is like renting a moving truck for one sandwich.
Step 5: Keep JavaScript Away From the First Paint
JavaScript can block rendering. It can also steal CPU time. On cheap phones, that hurts.
For better LCP, ask every script a mean question:
Do you need to run before the main content appears?
If not, delay it.
- Use defer for non-critical scripts.
- Use async for scripts that can run whenever.
- Break large bundles into smaller chunks.
- Remove unused third-party tags.
- Delay chat widgets, heatmaps, and popups.
Third-party scripts are sneaky. One little tag can call ten more files. Then your LCP gets punched in the face by a survey tool nobody asked for.
Step 6: Fix Fonts Before They Make Text Vanish
If your LCP element is text, fonts matter. Custom fonts can delay visible text. That is bad.
Use font-display: swap. This lets the browser show fallback text fast, then swap in the custom font.
@font-face {
font-family: "Inter";
src: url("/fonts/inter.woff2") format("woff2");
font-display: swap;
}
Also preload key fonts:
<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossorigin>
Use fewer font weights. You probably do not need 100, 200, 300, 400, 500, 600, 700, and 900. Your page is not a gym.
Step 7: Be Careful With Background Images
CSS background images can be tricky. The browser may discover them late because it must download CSS first.
If the hero image is the LCP element, prefer a normal <img> or <picture> tag. It gives the browser better clues.
If you must use a background image, preload it. Also keep the CSS file that references it small and early.
Step 8: Use Smart Rendering in 2026
Modern apps often use React, Vue, Svelte, Astro, Next.js, Nuxt, or similar tools. These can be fast. They can also ship too much JavaScript.
For LCP, the first view should not wait for a giant app bundle.
Better options include:
- Static rendering for pages that rarely change.
- Server rendering for fresh content.
- Partial hydration so only interactive parts use JavaScript.
- Islands architecture for content-heavy pages.
The idea is simple. Send useful HTML first. Add interactivity after. Users came for content, not a loading spinner doing yoga.
Step 9: Measure Real Users, Not Only Lab Scores
Lab tests are helpful. Real user data is better.
Why? Because your laptop is not your user’s phone. Your office Wi-Fi is not a train tunnel. Your clean browser profile is not someone’s 73-tab chaos machine.
Track LCP by:
- Device type.
- Country or region.
- Connection speed.
- Page template.
- Logged-in versus logged-out users.
A blog post may have a 1.8s LCP. A product page may sit at 3.9s. Fix templates, not just random pages.
A Simple LCP Checklist for 2026
- Find the exact LCP element.
- Keep server response fast.
- Preload the LCP image or font.
- Use fetchpriority=”high” for the main image.
- Do not lazy load the LCP image.
- Compress images with AVIF or WebP.
- Send correct image dimensions.
- Remove unused CSS.
- Defer non-critical JavaScript.
- Delay third-party scripts.
- Use font-display: swap.
- Measure real users every week.
The Bottom Line
LCP optimization is not about chasing a perfect score. It is about showing the main content fast. That makes users feel safe. It also helps search performance, ad results, signups, and sales.
Start with the LCP element. Make it small. Make it early. Make it obvious to the browser. Then clear the junk blocking it.
Fast pages feel polite. Slow pages feel like they forgot you were there.