Skip to content

Lazy Loading Images Not Working Fix

DodaTech Updated 2026-06-24 4 min read

In this tutorial, you'll learn about Lazy Loading Images Not Working Fix. We cover key concepts, practical examples, and best practices.

Images on your page still load all at once even though you added lazy loading — the loading="lazy" attribute is not working due to browser compatibility issues, incorrect attribute placement, or the images are in the initial viewport.

Step-by-Step Fix

1. Check the loading attribute

<!-- Wrong — loading attribute on the wrong element -->
<div loading="lazy">
  <img src="photo.jpg" alt="Photo">
</div>

<!-- Right — loading attribute on the <img> tag itself -->
<img src="photo.jpg" alt="Photo" loading="lazy">

2. Ensure images are below the fold

<!-- Wrong — images in the initial viewport (loading="lazy" has no effect) -->
<img src="hero.jpg" alt="Hero" loading="lazy">
<!-- First 3 images are in the viewport — browser loads them immediately -->

<!-- Right — only lazy load images below the fold -->
<img src="hero.jpg" alt="Hero"><!-- No lazy attr — above the fold -->

<img src="photo-1.jpg" alt="Photo 1" loading="lazy">
<img src="photo-2.jpg" alt="Photo 2" loading="lazy">
<!-- Images below the fold are loaded lazily -->

3. Use Intersection Observer for fallback

// Wrong — relying only on native lazy loading
// Old browsers (Safari <16) do not support loading="lazy"

// Right — use native with Intersection Observer fallback
document.addEventListener("DOMContentLoaded", function() {
  const lazyImages = document.querySelectorAll("img[loading='lazy']");

  if ("IntersectionObserver" in window) {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          const img = entry.target;
          img.src = img.dataset.src;
          img.removeAttribute("loading");
          observer.unobserve(img);
        }
      });
    });

    lazyImages.forEach(img => observer.observe(img));
  } else {
    // Fallback: load all images immediately
    lazyImages.forEach(img => {
      img.src = img.dataset.src;
    });
  }
});

4. Fix dynamic content lazy loading

// Wrong — lazy loading not applied to dynamically added images
function addImage(src) {
  const img = document.createElement("img");
  img.src = src;
  document.body.appendChild(img);
  // No lazy loading — loads immediately
}

// Right — apply lazy loading to dynamic images
function addImage(src) {
  const img = document.createElement("img");
  img.src = src;
  img.loading = "lazy";
  // Or use data-src pattern
  // img.dataset.src = src;
  document.body.appendChild(img);
}

Common Mistakes

Mistake Fix
loading="lazy" on above-the-fold images Do not lazy load images visible in the initial viewport
No fallback for older browsers Use Intersection Observer polyfill or library (lazysizes)
Missing width and height attributes Always set width/height to prevent layout shift (CLS)
Lazy loading only 1-2 images offscreen Native lazy loading works best with 10+ offscreen images
Dynamic content without lazy loading Apply lazy loading to images added via JavaScript

Prevention

  • Only lazy load images below the fold (use data-src pattern to detect).
  • Always set width and height on lazy-loaded images.
  • Use the native loading="lazy" attribute — it works in all modern browsers.
  • Test with Slow 3G throttling in DevTools to verify lazy loading works.
  • Use a lazy loading library (lazysizes, lozad) for maximum compatibility.

DodaTech Tools

Doda Browser respects native lazy loading attributes and includes developer tools to verify which images are loaded eagerly vs lazily. DodaZIP optimizes image archives for efficient progressive loading. Durga Antivirus Pro's UI uses lazy loading to keep its threat dashboard responsive.

Common Mistakes with loading not working

  1. Overlapping type class instances that cause GHC to reject the program with ambiguous dispatch errors
  2. Non-exhaustive pattern matches that compile with warnings then crash at runtime
  3. Misunderstanding that String is [Char] with poor performance for large text operations

These mistakes appear frequently in real-world LAZY code. DodaTech's contributors have identified these patterns through analysis of open-source projects and production systems.

Practice Exercise

Write a pure function that safely divides two integers using Maybe, then test it with edge cases like division by zero and negative numbers.

This exercise reinforces the concepts covered in this guide. Try implementing it before checking online solutions.

FAQ

Why are my lazy-loaded images still showing in the initial page load?

Images in the initial viewport are not lazy-loaded by the browser — they load immediately even with loading="lazy". Only images below the fold benefit from native lazy loading. ||| What browsers support loading="lazy"? All modern browsers support it: Chrome 77+, Firefox 75+, Safari 16.4+, Edge 79+. For older browsers, use an Intersection Observer polyfill or a lazy loading library. ||| Does lazy loading affect SEO? Google's crawler renders pages and waits for lazy-loaded content. As long as images are loaded when the crawler scrolls, lazy loading does not negatively affect SEO.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro