All articles
Article 3 min read

A Comprehensive Guide to Using SVG Icons in React, Next.js, and Tailwind CSS

This guide explains how to integrate SVG icons into a React project using Next.js and Tailwind CSS for styling.

Introduction

SVG (Scalable Vector Graphics) icons are an excellent way to add interactive elements to your web applications without the need for additional images. When working with React, it’s important to understand how to effectively incorporate these icons in your projects, particularly when leveraging Next.js as a server-rendered framework and Tailwind CSS for styling. This article will walk you through three sensible ways to get SVG icons into your React codebase using both Next.js and Tailwind CSS.

Inline SVG Icons

The simplest way is to include the SVG icon directly within your component's JSX:

jsx
import Icon from './path/to/icon.svg'; // If using a component file for the SVG, adjust the path accordingly

const MyComponent = () => (
  <div>
    <Icon />
  </div>
);

This approach is straightforward but limits you to inline usage and may not scale well with larger projects.

As Static Files

For more complex scenarios where you might want to reuse icons across multiple components, consider serving the SVG icon files as static assets:

jsx
import MyIcon from '../assets/my-icon.svg';

const MyComponent = () => (
  <div>
    <MyIcon />
  </div>
);

Ensure your configuration in Next.js (if using it) is correctly set up to serve these static assets.

Using SVG React Components

Another effective method is by creating a reusable svg-react component for the icon. This allows you to abstract away some of the complexity and keep your code DRY:

jsx
import React, { forwardRef } from 'react';
import MyIconSVG from '../assets/my-icon.svg';

const SvgIcon = forwardRef(({ width, height }, ref) => (
  <svg
    ref={ref}
    viewBox="0 0 24 24"
    width={width || '1em'}
    height={height || '1em'}
    xmlns="http://www.w3.org/2000/svg"
  >
    {MyIconSVG}
  </svg>
));

export default SvgIcon;

You can then use this component in your components like so:

jsx
import MyComponent from './path/to/my-component';
import SvgIcon from '../components/SvgIcon';

const MyComponent = () => (
  <div>
    <SvgIcon />
  </div>
);

Tailwind CSS for Styling

Once you have your icons in place, styling them becomes a breeze with Tailwind CSS. You can use the inline-block utility along with Tailwind’s responsive design utilities to make your icons dynamic and adaptable:

jsx
import MyComponent from './path/to/my-component';
import SvgIcon from '../components/SvgIcon';

const MyComponent = () => (
  <div className="flex items-center">
    <SvgIcon width="2rem" height="2rem"/>
  </div>
);

Tailwind’s utility-first approach means you can quickly apply various styles to your SVG icons such as text-primary, border-dashed, and many others, making the process efficient and straightforward.

Conclusion

By understanding these methods for integrating SVG icons into a React project with Next.js and leveraging Tailwind CSS for styling, developers can maintain code quality while keeping their projects scalable and modern. Each method offers its own benefits depending on your specific use case or personal preference, so it’s worth experimenting to find what works best for you.

Whether through inline integration, as static files, or using reusable components, SVG icons provide a versatile solution for adding interactivity and aesthetic appeal to web applications.