Lazy loading is one of the most effective โ and most commonly misimplemented โ image optimizations available. Done right, it can dramatically reduce initial page weight and improve your Core Web Vitals. Done wrong, it can actively hurt your LCP score and slow down your most important content.
What Is Lazy Loading?
By default, browsers load all images on a page as soon as it starts rendering โ even images that are far below the fold that the user may never scroll to. Lazy loading defers the loading of off-screen images until the user scrolls near them.
In HTML, enabling lazy loading is a single attribute:
<img src="photo.webp" alt="Photo" loading="lazy">
That's it. The browser handles everything else natively. No JavaScript required for basic lazy loading.
How Lazy Loading Improves Core Web Vitals
Lazy loading helps primarily with two aspects of page performance:
- Reduces initial page weight: If a page has 20 images and 15 are below the fold, lazy loading means the browser only downloads 5 images on initial load. This frees up bandwidth for the images that actually matter.
- Improves LCP indirectly: By reducing the total bytes downloaded initially, the browser can focus its network resources on above-the-fold content โ including the LCP element โ which loads faster.
On pages with many images, lazy loading can reduce initial page weight by 40โ60%, directly improving Time to Interactive and perceived load speed.
The Critical Mistake: Lazy Loading Your LCP Image
This is the single most common lazy loading mistake, and it actively hurts SEO. If you add loading="lazy" to your hero image โ the first large image the user sees โ you're telling the browser to delay loading your most important content.
The result: your LCP metric gets worse, not better.
The rule is simple:
- Above-the-fold images: Never use
loading="lazy". Useloading="eager"(default) or omit the attribute. - Hero/banner images: Add
fetchpriority="high"to tell the browser to prioritize this image. - Below-the-fold images: Always use
loading="lazy".
priority vs fetchpriority โ What's the Difference?
For your LCP image, you want to do two things:
<!-- Hero / LCP image: eager + high priority --> <img src="hero.webp" alt="Hero image" width="1200" height="630" loading="eager" fetchpriority="high" > <!-- Below-fold images: lazy --> <img src="product.webp" alt="Product photo" width="400" height="400" loading="lazy" >
fetchpriority="high" tells the browser's preload scanner to fetch this resource as a high-priority network request, even before the full HTML is parsed.
Lazy Loading and Layout Shift (CLS)
One subtle but important interaction: lazy loading without explicit image dimensions can cause Cumulative Layout Shift. When a lazy-loaded image loads, if the browser doesn't know the image dimensions in advance, it will push content down to make room โ causing a layout shift.
Always specify width and height attributes on your images:
<img src="photo.webp" alt="Photo" width="800" height="600" loading="lazy">
This lets the browser reserve the correct amount of space before the image loads, eliminating layout shift.
How Image Inspector Helps
Image Inspector checks every image on a page for the loading attribute and whether it's below the fold. It flags:
- Warning: Below-fold image missing
loading="lazy" - Warning: Image with no
srcsetthat could benefit from responsive loading
This gives you an immediate list of images where adding loading="lazy" would improve performance โ without having to manually audit each one.
Lazy Loading Checklist
- Add
loading="lazy"to every image below the fold - Never add
loading="lazy"to hero/banner/LCP images - Add
fetchpriority="high"to your LCP image - Always specify
widthandheightto prevent layout shift - Use Image Inspector to identify which images are missing lazy loading