ApiaryActive
Try: pause · settings · learn · wipe
← Community / Reading Room
BI
browser-apis · 3 min read

browser intersection observer

=====================================

=====================================

Imagine you're a busy bee collecting nectar from flowers in the garden of the web. Your task is to observe which flowers are visible in the current viewport, so you can optimize your collection route accordingly. Sounds like a sweet problem, doesn't it?

In this article, we'll dive into the IntersectionObserver API, a powerful tool for observing elements as they intersect with the viewport. This technique replaces traditional scroll listeners and is particularly useful for lazy loading, infinite scrolling, and viewport-triggered animations.

The Technique

The Intersection Observer API allows you to observe when an element intersects with another element or the viewport. When an intersection occurs, it sends a notification, allowing your code to take action.

Here's a basic example of creating an IntersectionObserver instance:

const observer = new IntersectionObserver((entries) => {
  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      // Element is visible in the viewport
    }
  });
}, { rootMargin: '0px' });

In this example, we create an IntersectionObserver instance and pass a callback function that will be executed when an intersection occurs. The { rootMargin: '0px' } options object sets the root element's margin to zero, which means the observer will observe intersections with the viewport itself.

Example 1: Lazy Loading

Lazy loading is a technique where images or other resources are loaded only when they come into view. This reduces initial page load times and improves performance.

// Get all image elements on the page
const images = document.querySelectorAll('img');

images.forEach((image) => {
  const observer = new IntersectionObserver((entries) => {
    if (entries[0].isIntersecting) {
      // Load the image
      image.src = image.dataset.source;
    }
  }, { rootMargin: '100px' });
  observer.observe(image);
});

In this example, we use IntersectionObserver to observe when an image comes into view. When the intersection occurs, we load the image by setting its src attribute.

Example 2: Infinite Scrolling

Infinite scrolling is a technique where content is loaded dynamically as the user scrolls down the page.

// Get the container element and the button to trigger loading
const container = document.getElementById('container');
const loadButton = document.getElementById('load-button');

const observer = new IntersectionObserver((entries) => {
  if (entries[0].isIntersecting && !loadButton.disabled) {
    // Load more content
    const newContent = getNewContent();
    container.appendChild(newContent);
    loadButton.disabled = true;
  }
}, { rootMargin: '100px' });

observer.observe(container);

In this example, we use IntersectionObserver to observe when the container element comes into view. When the intersection occurs and the button is not disabled, we load more content by appending it to the container.

Example 3: Viewport-Triggered Animation

Viewport-triggered animations are a great way to add visual effects that respond to user interaction.

// Get all elements with the class 'animate-on-scroll'
const animatableElements = document.querySelectorAll('.animate-on-scroll');

animatableElements.forEach((element) => {
  const observer = new IntersectionObserver((entries) => {
    if (entries[0].isIntersecting) {
      // Animate the element
      animate(element);
    }
  }, { rootMargin: '100px' });
  observer.observe(element);
});

In this example, we use IntersectionObserver to observe when an element with the class animate-on-scroll comes into view. When the intersection occurs, we animate the element.

When NOT to Use It

While IntersectionObserver is a powerful tool, there are cases where it might not be the best choice:

  • If you need to observe intersections between multiple elements, consider using a different approach, such as event delegation.
  • If you're working with older browsers that don't support IntersectionObserver, consider using alternative techniques or polyfills.

Related Apiary Lessons

If you'd like to learn more about related topics, check out these lessons:

  • [Browser Event Loop](browser-event-loop.md)
  • [Async Programming in JavaScript](async-programming-in-javascript.md)

Conclusion

In this article, we've explored the IntersectionObserver API and its uses for lazy loading, infinite scrolling, and viewport-triggered animations. By using IntersectionObserver, you can improve your web application's performance and user experience.

As a busy bee, remember to always observe your surroundings and optimize your collection route accordingly!

"Just like a honeybee observes the flowers in bloom, IntersectionObserver observes elements in the viewport, making your web app buzz with efficiency!"

Frequently asked
What is browser intersection observer about?
=====================================
What should you know about the Technique?
The Intersection Observer API allows you to observe when an element intersects with another element or the viewport. When an intersection occurs, it sends a notification, allowing your code to take action.
What should you know about example 1: Lazy Loading?
Lazy loading is a technique where images or other resources are loaded only when they come into view. This reduces initial page load times and improves performance.
What should you know about example 2: Infinite Scrolling?
Infinite scrolling is a technique where content is loaded dynamically as the user scrolls down the page.
What should you know about example 3: Viewport-Triggered Animation?
Viewport-triggered animations are a great way to add visual effects that respond to user interaction.
References & sources
  1. Apiary Reading RoomOpen, cited knowledge base — funded to keep bee & practical research free.
From the Apiary Reading Room. Opinion & editorial — not financial advice. We don't overclaim.
More from the Reading Room