How to Use Tailwind CSS with Next.js for Rapid Styling

Mobile Developer
February 5, 2025
Updated on February 21, 2025
0 MIN READ
#architecture#cicd#tailwind#next.js

Introduction

Tailwind CSS has revolutionized the way developers approach styling by offering a utility-first CSS framework that promotes rapid development without sacrificing customization. When paired with Next.js, a powerful React framework for server-side rendering and static site generation, Tailwind becomes an even more powerful tool for building modern, performant web applications.

In this guide, we’ll walk through how to integrate Tailwind CSS with Next.js, configure it for optimal performance, and leverage its utility classes for efficient styling. Whether you're starting a new project or adding Tailwind to an existing Next.js app, this guide will help you streamline your workflow.


Setting Up Tailwind CSS in a Next.js Project

Before diving into styling, we need to set up Tailwind CSS in a Next.js project. The process is straightforward, thanks to Tailwind’s PostCSS integration.

Step 1: Create a Next.js Project (If You Haven’t Already)

If you’re starting fresh, initialize a Next.js project using:

npx create-next-app@latest my-tailwind-app  
cd my-tailwind-app

Step 2: Install Tailwind CSS and Its Dependencies

Next, install Tailwind CSS, PostCSS, and Autoprefixer:

npm install -D tailwindcss postcss autoprefixer  
npx tailwindcss init

Step 3: Configure tailwind.config.js

The npx tailwindcss init command generates a tailwind.config.js file. Update it to include your project’s template paths:

module.exports = {  
  content: [  
    "./pages/**/*.{js,ts,jsx,tsx}",  
    "./components/**/*.{js,ts,jsx,tsx}",  
  ],  
  theme: {  
    extend: {},  
  },  
  plugins: [],  
}

Step 4: Add Tailwind to Your CSS

Create a global CSS file (e.g., styles/globals.css) and include Tailwind’s directives:

@tailwind base;  
@tailwind components;  
@tailwind utilities;

Step 5: Import the CSS File in _app.js

Finally, import the CSS file in your pages/_app.js:

import '../styles/globals.css' function MyApp({ Component, pageProps }) { return <Component {...pageProps} /> } export default MyApp

Now, Tailwind CSS is ready to use in your Next.js project!


Leveraging Tailwind’s Utility Classes for Rapid Styling

Tailwind’s utility-first approach means you style elements by applying pre-defined classes directly in your markup. This eliminates the need for writing custom CSS in most cases, speeding up development.

Example: Styling a Button

Here’s how you can create a styled button using Tailwind:

<button className="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors">  
  Click Me  
</button>
  • px-4 and py-2 add horizontal and vertical padding.
  • bg-blue-600 sets the background color.
  • text-white defines the text color.
  • rounded-lg applies rounded corners.
  • hover:bg-blue-700 changes the background on hover.
  • transition-colors adds a smooth color transition.

Responsive Design with Tailwind

Tailwind makes responsive design effortless with its breakpoint prefixes (sm, md, lg, xl, 2xl). For example:

<div className="text-sm md:text-base lg:text-lg"> This text scales with screen size. </div>
  • On small screens, the text size is sm.
  • On medium screens (md), it increases to base.
  • On large screens (lg), it becomes lg.

Optimizing Tailwind for Production

While Tailwind is powerful, its default configuration includes many unused styles. To optimize performance, we need to purge unused CSS in production.

Enabling PurgeCSS in tailwind.config.js

Ensure your tailwind.config.js includes the correct paths for purging:

module.exports = {  
  purge: [  
    "./pages/**/*.{js,ts,jsx,tsx}",  
    "./components/**/*.{js,ts,jsx,tsx}",  
  ],  
  // Rest of the config...  
}

This ensures only the classes used in your project are included in the final CSS bundle.

Using JIT Mode for Faster Development

Tailwind’s Just-In-Time (JIT) mode generates styles on demand, reducing build times and enabling arbitrary value support (e.g., w-[200px]). Enable it in tailwind.config.js:

module.exports = {  
  mode: 'jit',  
  purge: [  
    // ...paths  
  ],  
  // ...rest  
}

With JIT mode, you can use dynamic classes like:

<div className="w-[calc(100%-2rem)]">...</div>

Extending Tailwind with Custom Configurations

Tailwind is highly customizable. You can extend its default theme to match your design system.

Adding Custom Colors

In tailwind.config.js, extend the theme object:

module.exports = {  
  theme: {  
    extend: {  
      colors: {  
        brand: {  
          primary: '#3a86ff',  
          secondary: '#8338ec',  
        },  
      },  
    },  
  },  
}

Now, you can use bg-brand-primary or text-brand-secondary in your classes.

Creating Reusable Components with @apply

For repeated styles, use @apply in your CSS:

.btn-primary {  
  @apply px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors;  
}

Then, apply it in your JSX:

<button className="btn-primary">Click Me</button>

Conclusion

Tailwind CSS and Next.js are a perfect match for developers who value speed, flexibility, and maintainability. By following this guide, you’ve learned how to:

  1. Set up Tailwind CSS in a Next.js project.
  2. Use utility classes for rapid styling.
  3. Optimize Tailwind for production with purging and JIT mode.
  4. Extend Tailwind with custom configurations.

With these techniques, you can build visually appealing, responsive interfaces faster than ever. Happy coding! 🚀

Share this article