You've probably heard "lazy load your images" as a blanket rule for better SEO — so you
applied loading="lazy" across the board, ran a Lighthouse audit, and somehow
your Largest Contentful Paint score got worse, not better. That's not a fluke. Lazy
loading and eager loading aren't a "pick one" decision; they're two tools for two
different jobs, and using the wrong one on the wrong image is one of the most common
self-inflicted Core Web Vitals problems on the web today.
The confusion usually comes from treating "loading strategy" as a single site-wide setting. In reality, the right answer depends entirely on where each individual image sits on the page — specifically, whether it's visible the instant the page loads or whether the visitor has to scroll to reach it. Get that split right, image by image, and both metrics move in your favor at once.
Neither lazy loading nor eager loading is universally better — the SEO win comes from using both, applied correctly. Eager load only the image that will become your Largest Contentful Paint element, usually the hero image, and lazy load everything below the fold. This combination shrinks initial page weight while keeping your LCP timing fast, which is what search engines actually measure.
What are lazy loading and eager loading?
Both terms describe when the browser decides to fetch an image's data from the network, relative to when the page first parses:
- Eager loading. The browser's default behavior when no
loadingattribute is set, or when it's explicitly set toloading="eager". The image is requested immediately as the HTML parses, regardless of whether it's visible on screen yet. - Lazy loading. Set via
loading="lazy". The browser defers the network request until the image is a certain distance from entering the viewport — meaning images far down a long page simply aren't downloaded until the visitor scrolls near them. - Native vs JavaScript lazy loading. Modern browsers support the
loading="lazy"attribute natively, with no extra script needed. Older JavaScript-based lazy-load libraries (using IntersectionObserver or scroll listeners) still exist but add extra code weight the native attribute doesn't require. - fetchpriority. A related attribute,
fetchpriority="high", doesn't change when an image loads but tells the browser to prioritize it over other eagerly-loaded resources competing for bandwidth — commonly paired with the LCP image.
The key idea: loading strategy is a per-image decision, not a site-wide one. The same page can — and usually should — mix both.
Why the split matters for SEO
Search engines don't grade "did you use lazy loading." They grade the outcomes it produces, mainly through Core Web Vitals:
- Largest Contentful Paint (LCP). Measures how long the largest visible element takes to render. If that element is an image and it's lazy loaded, the browser delays requesting it, directly worsening this score — one of the most common LCP regressions in real audits.
- Cumulative Layout Shift (CLS). Both lazy and eager images can cause shift if the browser doesn't know their dimensions in advance. Lazy-loaded images pop in later in the page lifecycle, which tends to make missing dimensions more visually noticeable.
- Total page weight and load time. Eager loading every image on a long page forces the browser to compete for bandwidth across dozens of requests at once, even for content the visitor may never scroll to see.
- Crawl and render budget. Googlebot renders pages to discover content, including images, but it still benefits from pages that load efficiently — bloated eager-loaded pages can slow down how much a crawler processes per visit at scale.
Step-by-step: choosing the right strategy per image
- Identify your LCP candidate. This is almost always the largest image visible without scrolling — a hero banner, a product photo, or a featured article image.
-
Eager load that one image. Either omit the
loadingattribute entirely (eager is the default) or setloading="eager"explicitly, and addfetchpriority="high"so the browser fetches it ahead of competing resources. -
Lazy load everything below the fold. Add
loading="lazy"to every image that requires scrolling to reach — product grids, article body images, footer logos, and so on. - Set explicit width, height, or aspect-ratio on every image. This reserves layout space before the image loads, regardless of whether it's lazy or eager, and is the single biggest lever against layout shift.
- Watch carousels and sliders. If the first slide is visible on load, its image needs eager loading even though it sits inside a component that feels "below the header."
- Re-test with Lighthouse or PageSpeed Insights. Confirm the LCP element is no longer flagged as lazily loaded, and check the CLS score after adding dimensions.
- Extend the same logic to iframes and embeds. Below-fold videos, maps, and embedded widgets benefit from the same lazy treatment as images.
Common mistakes that quietly hurt your scores
1. Lazy loading the hero image
The single most common mistake. Applying a blanket loading="lazy" across every
<img> tag on a page, including the one at the very top, directly delays
the request for whatever the browser identifies as your LCP element.
2. Skipping width and height attributes
Neither lazy nor eager loading fixes layout shift on its own. Without explicit dimensions, the browser can't reserve space for an image before it loads, and the page jumps as content pops in — an even more visible problem with lazy-loaded images that appear later.
3. Lazy loading everything inside a carousel
If the first slide of a carousel is visible on page load, it needs eager loading even though carousels often get treated as "below the header" by default. Only the slides a visitor would need to click or scroll to reach should be lazy loaded.
4. Relying on outdated JavaScript lazy-load libraries
Native loading="lazy" is supported in all modern browsers and needs no extra
script. Older IntersectionObserver-based libraries add unnecessary JavaScript weight and
can behave inconsistently with the browser's own rendering pipeline.
Real-world impact examples
These are representative results from correcting the loading strategy on real pages, without changing anything else about the images themselves:
The pattern holds across page types: eager loading the one image that matters for LCP, lazy loading the rest, and giving every image reserved dimensions covers almost all of the measurable improvement available from loading strategy alone.
Comparison: lazy loading vs eager loading
Here's how the two strategies compare directly, so you can see why the right answer is "both, applied to the right images" rather than a single site-wide choice:
| Factor | Eager loading | Lazy loading |
|---|---|---|
| Best for | Above-the-fold and LCP images | Below-the-fold images |
| Effect on LCP | Improves or neutral | Worsens if misapplied |
| Initial page weight | Higher | Lower |
| CLS risk without sizing | Present | Present, often more visible |
| Bandwidth use on long pages | Wasteful if overused | Efficient |
| Implementation effort | Low — default or one attribute | Low — one attribute, native support |
| SEO effect when misapplied | Wasted bandwidth | Delayed LCP if used on hero image |
Free tool: Aspect Ratio and CLS Calculator
The Rebrixe Aspect Ratio and CLS Calculator runs entirely in your browser. Enter an image's dimensions and it generates the exact width, height, and aspect-ratio values to reserve the right amount of space in your layout — for both eager and lazy-loaded images. No account, no upload, no watermark.
Stop layout shift before it starts
Get the exact width, height, and aspect-ratio CSS for any image in seconds.