Skip to Content

How to Use Intersection Observer API to Implement Lazy Loading with Scrollable DIV Element

  • The article explains how to use the Intersection Observer API to implement lazy loading with a scrollable DIV element, which can improve the performance and user experience of web pages.
  • The article provides the HTML, CSS, and JavaScript code for the solution.

Lazy loading is a technique that allows you to defer the loading of images or other resources until they are needed. This can improve the performance and user experience of your web pages, especially if they contain a lot of images or other heavy content.

One way to implement lazy loading is to use the Intersection Observer API, which lets you detect when an element becomes visible or hidden in the viewport or in another element. You can use this API to trigger the loading of images only when they are about to be seen by the user.

In this article, I will show you how to use the Intersection Observer API to implement lazy loading with a scrollable DIV element. This is useful if you have a fixed-size container that displays a list of images or other content that can be scrolled horizontally or vertically.

How to Use Intersection Observer API to Implement Lazy Loading with Scrollable DIV Element

Problem

The HTML code for this page is:

<div class="container">
  <h1>Lazy Loading with Scrollable DIV</h1>
  <div class="wrapper" id="wrapper">
    <img class="lazyload" src="placeholder.png" data-src="image1.jpg" alt="Image 1" />
    <img class="lazyload" src="placeholder.png" data-src="image2.jpg" alt="Image 2" />
    <img class="lazyload" src="placeholder.png" data-src="image3.jpg" alt="Image 3" />
    <img class="lazyload" src="placeholder.png" data-src="image4.jpg" alt="Image 4" />
    <img class="lazyload" src="placeholder.png" data-src="image5.jpg" alt="Image 5" />
    <!-- more images -->
  </div>
</div>

The CSS code for this page is:

.container {
  width: 80%;
  margin: 0 auto;
}

.wrapper {
  width: 100%;
  height: 300px;
  overflow-x: scroll;
  white-space: nowrap;
}

.lazyload {
  width: 300px;
  height: 300px;
}

As you can see, we have a wrapper DIV element with an ID of wrapper that contains several images with a class of lazyload. Each image has a src attribute that points to a placeholder image and a data-src attribute that points to the actual image. The wrapper DIV has a fixed height and width and allows horizontal scrolling.

The problem with this code is that all the images are loaded at once, even if they are not visible in the viewport. This can cause unnecessary network requests and bandwidth consumption, as well as slow down the page load time.

Solution

To solve this problem, we can use the Intersection Observer API to monitor the visibility of the images in the wrapper DIV and load them only when they are about to enter the viewport.

To use the Intersection Observer API, we need to do the following steps:

  1. Create an instance of the IntersectionObserver constructor and pass it a callback function and an optional options object.
  2. In the callback function, loop through the entries array and check if each entry is intersecting with the root element (the wrapper DIV in our case).
  3. If an entry is intersecting, set its src attribute to its data-src attribute and remove it from the observer.
  4. Select all the images with the lazyload class and call the observe method on each one of them.

Here is how our JavaScript code looks like:

// Select the wrapper element
const wrapper = document.getElementById("wrapper");

// Create an instance of IntersectionObserver
const observer = new IntersectionObserver(
  // The callback function
  (entries) => {
    // Loop through the entries array
    entries.forEach((entry) => {
      // Check if the entry is intersecting
      if (entry.isIntersecting) {
        // Get the image element from the entry target
        const image = entry.target;
        // Set its src attribute to its data-src attribute
        image.src = image.dataset.src;
        // Remove it from the observer
        observer.unobserve(image);
      }
    });
  },
  // The options object
  {
    // Set the root element to the wrapper element
    root: wrapper,
    // Set the threshold to 0.5 (50% visibility)
    threshold: 0.5,
  }
);

// Select all the images with lazyload class
const images = document.querySelectorAll(".lazyload");

// Loop through the images array
images.forEach((image) => {
  // Call observe method on each image
  observer.observe(image);
});

Now, if we reload the page and scroll the wrapper DIV, we can see that the images are loaded only when they are half visible in the viewport.

Conclusion

In this article, we learned how to use the Intersection Observer API to implement lazy loading with a scrollable DIV element. This can improve the performance and user experience of our web pages by reducing the network requests and bandwidth consumption.

We also learned how to use the IntersectionObserver constructor, the observe and unobserve methods, and the isIntersecting property.

Frequently Asked Questions

Here are some common questions and answers related to lazy loading with a scrollable DIV using the Intersection Observer API.

Question: What is lazy loading?

Answer: Lazy loading is a technique that allows you to defer the loading of images or other resources until they are needed. This can improve the performance and user experience of your web pages, especially if they contain a lot of images or other heavy content.

Question: What is the Intersection Observer API?

Answer: The Intersection Observer API is a web API that lets you detect when an element becomes visible or hidden in the viewport or in another element. You can use this API to trigger actions based on the visibility of elements, such as lazy loading images.

Question: How do I use the Intersection Observer API?

Answer: To use the Intersection Observer API, you need to do the following steps:

  1. Create an instance of the IntersectionObserver constructor and pass it a callback function and an optional options object.
  2. In the callback function, loop through the entries array and check if each entry is intersecting with the root element (the viewport or another element).
  3. If an entry is intersecting, perform some action on it, such as loading an image or playing a video.
  4. Select the elements that you want to observe and call the observe method on each one of them.

Question: How do I set the root element for the Intersection Observer?

Answer: By default, the root element for the Intersection Observer is the viewport, which is the visible area of the browser window. However, you can also set a different root element by passing it as an option to the IntersectionObserver constructor. For example, if you want to use a scrollable DIV as the root element, you can do something like this:

// Select the scrollable DIV element
const root = document.getElementById("scrollable-div");

// Create an instance of IntersectionObserver with root option
const observer = new IntersectionObserver(callback, { root: root });

Question: How do I set the threshold for the Intersection Observer?

Answer: The threshold is a value between 0 and 1 that determines how much of an element’s area needs to be visible in order to trigger the callback function. For example, if you set the threshold to 0.5, then the callback function will be called when at least 50% of an element’s area is visible in the root element. You can pass the threshold as an option to the IntersectionObserver constructor. For example:

// Create an instance of IntersectionObserver with threshold option
const observer = new IntersectionObserver(callback, { threshold: 0.5 });

You can also pass an array of thresholds to create multiple triggers for different visibility ratios. For example:

// Create an instance of IntersectionObserver with multiple thresholds
const observer = new IntersectionObserver(callback, {
  threshold: [0, 0.25, 0.5, 0.75, 1],
});

This will create five triggers for when an element’s visibility ratio is 0%, 25%, 50%, 75%, or 100%.

Disclaimer: This article is for informational purposes only and does not constitute professional advice. The author is not responsible for any damages or losses caused by following or applying any of the information in this article. Always consult a qualified web developer before implementing any web development techniques or solutions.

Alex Lim is a certified IT Technical Support Architect with over 15 years of experience in designing, implementing, and troubleshooting complex IT systems and networks. He has worked for leading IT companies, such as Microsoft, IBM, and Cisco, providing technical support and solutions to clients across various industries and sectors. Alex has a bachelor’s degree in computer science from the National University of Singapore and a master’s degree in information security from the Massachusetts Institute of Technology. He is also the author of several best-selling books on IT technical support, such as The IT Technical Support Handbook and Troubleshooting IT Systems and Networks. Alex lives in Bandar, Johore, Malaysia with his wife and two chilrdren. You can reach him at [email protected] or follow him on Website | Twitter | Facebook

    Ads Blocker Image Powered by Code Help Pro

    Your Support Matters...

    We run an independent site that is committed to delivering valuable content, but it comes with its challenges. Many of our readers use ad blockers, causing our advertising revenue to decline. Unlike some websites, we have not implemented paywalls to restrict access. Your support can make a significant difference. If you find this website useful and choose to support us, it would greatly secure our future. We appreciate your help. If you are currently using an ad blocker, please consider disabling it for our site. Thank you for your understanding and support.