top of page
Abdul Wahith

Implementing Responsive Layouts in React with ResizeObserver API


Learn how to create responsive layouts in React using the ResizeObserver API. This guide covers project setup, custom hook creation, component integration, styling, and testing to help you build adaptive and dynamic user interfaces.


Responsive design is crucial in modern web development to ensure applications look great on all devices. One powerful tool for achieving responsive layouts in React is the ResizeObserver API. This API allows you to observe changes to the size of an element and adjust your layout accordingly. In this blog, we will explore how to implement responsive layouts in React using the ResizeObserver API.


Introduction

The ResizeObserver API is a modern JavaScript API that allows you to track changes to the size of DOM elements. This is particularly useful in React for creating responsive and adaptive components that react to size changes in their environment. In this tutorial, we will create a responsive layout in React that adjusts its design based on the size of a container element.


Setting Up the Project

First, let's set up our React project. If you don't have a React project already, you can create one using Create React App.



npx create-react-app responsive-layout
cd responsive-layout
npm start

This will create a new React application and start the development server.


Understanding ResizeObserver API

The ResizeObserver API allows us to listen for changes in the dimensions of a specified DOM element. Unlike window resize events, ResizeObserver provides more granular control, as it can observe any element, not just the window.


The basic usage involves creating a new ResizeObserver instance and passing a callback function that will be invoked whenever the size of the observed element changes.


Creating a Custom Hook for ResizeObserver

To keep our code clean and reusable, we'll create a custom hook called useResizeObserver. This hook will encapsulate the logic for setting up the ResizeObserver and provide an easy-to-use interface.


Create a new file named useResizeObserver.js in the src directory.



import { useEffect, useRef, useState } from 'react';

const useResizeObserver = () => {
  const [dimensions, setDimensions] = useState({});
  const ref = useRef(null);

  useEffect(() => {
    const observeTarget = ref.current;
    const resizeObserver = new ResizeObserver((entries) => {
      entries.forEach((entry) => {
        setDimensions(entry.contentRect);
      });
    });

    if (observeTarget) {
      resizeObserver.observe(observeTarget);
    }

    return () => {
      if (observeTarget) {
        resizeObserver.unobserve(observeTarget);
      }
    };
  }, []);

  return [ref, dimensions];
};

export default useResizeObserver;

Applying ResizeObserver to a React Component

Next, we’ll create a component that uses our useResizeObserver hook to adjust its layout based on its size.


Create a new file named ResponsiveComponent.js in the src directory.



import React from 'react';
import useResizeObserver from './useResizeObserver';
import './ResponsiveComponent.css';

const ResponsiveComponent = () => {
  const [ref, dimensions] = useResizeObserver();

  return (
    <div ref={ref} className="responsive-container">
      <div className="content">
        <h1>Responsive Layout</h1>
        <p>Width: {dimensions.width}px</p>
        <p>Height: {dimensions.height}px</p>
      </div>
    </div>
  );
};

export default ResponsiveComponent;

Styling the Responsive Layout

Create a ResponsiveComponent.css file in the src directory to style our component.



.responsive-container {
  border: 1px solid #ddd;
  padding: 20px;
  margin: 20px;
  resize: both;
  overflow: auto;
}

.content {
  transition: all 0.3s ease;
}

@media (max-width: 600px) {
  .content {
    background-color: lightblue;
  }
}

@media (min-width: 601px) and (max-width: 1024px) {
  .content {
    background-color: lightgreen;
  }
}

@media (min-width: 1025px) {
  .content {
    background-color: lightcoral;
  }
}

Testing the Responsive Layout

Now, let's test our responsive layout by using the ResponsiveComponent in App.js.



import React from 'react';
import ResponsiveComponent from './ResponsiveComponent';

function App() {
  return (
    <div className="App">
      <h1>React ResizeObserver Example</h1>
      <ResponsiveComponent />
    </div>
  );
}

export default App;

When you run your application, you should see a resizable container. As you resize the container, the background color of the content will change based on the current width, demonstrating a responsive layout.


Conclusion

In this blog, we've explored how to implement responsive layouts in React using the ResizeObserver API. By creating a custom hook and applying it to a component, we can efficiently track size changes and adjust our layouts accordingly. This approach provides a powerful way to create adaptive and dynamic user interfaces in React.

9 views0 comments

Yorumlar


bottom of page