Tailwind CSS with React Complete Integration Guide
Tailwind CSS and React are a powerful combination for building modern user interfaces. This guide covers setting up Tailwind CSS in React projects using Vite and Next.js, best practices for using utility classes in JSX, conditional styling patterns, and reusable component techniques.
Using Tailwind CSS with React: Install with npm install -D tailwindcss @tailwindcss/vite, add the plugin to your Vite config, import Tailwind CSS in your stylesheet, then use utility classes via className in JSX. All Tailwind CSS utilities work in React including responsive, hover, focus, and dark mode variants.
React + Vite + Tailwind CSS Setup
npm create vite@latest my-react-app -- --template react-ts
cd my-react-app
npm install
npm install -D tailwindcss @tailwindcss/viteSee the complete Vite setup guide for full configuration details.
Next.js + Tailwind CSS Setup
Next.js 16 uses the PostCSS plugin instead of the Vite plugin.
npx create-next-app@latest my-next-app
cd my-next-app
npm install -D tailwindcss @tailwindcss/postcss// postcss.config.mjs
export default {
plugins: ["@tailwindcss/postcss"],
}/* app/globals.css */
@import "tailwindcss";Using Tailwind CSS in JSX Components
Apply Tailwind CSS utility classes using React's className attribute instead of HTML's class.
// components/Card.tsx
interface CardProps {
title: string;
description: string;
href: string;
}
export default function Card({ title, description, href }: CardProps) {
return (
<a
href={href}
className="block p-6 bg-gray-800 rounded-xl border border-gray-700
hover:border-cyan-500 hover:bg-gray-750 transition-all
duration-300 group"
>
<h3 className="text-lg font-semibold text-white mb-2
group-hover:text-cyan-400 transition-colors">
{title}
</h3>
<p className="text-gray-400 text-sm leading-relaxed">
{description}
</p>
</a>
)
}Conditional Classes in React
Three common patterns for conditionally applying Tailwind CSS classes in React components.
// Pattern 1: Template literals
<button className={`px-4 py-2 rounded-lg font-medium transition-colors
${isActive ? 'bg-cyan-500 text-white' : 'bg-gray-700 text-gray-300'}`}>
{label}
</button>
// Pattern 2: clsx library (npm install clsx)
import clsx from 'clsx'
<button className={clsx(
'px-4 py-2 rounded-lg font-medium transition-colors',
isActive && 'bg-cyan-500 text-white',
!isActive && 'bg-gray-700 text-gray-300',
isDisabled && 'opacity-50 cursor-not-allowed'
)}>
{label}
</button>
// Pattern 3: Object syntax with clsx
<div className={clsx({
'p-4 rounded-lg': true,
'bg-green-500/10 border-green-500': status === 'success',
'bg-red-500/10 border-red-500': status === 'error',
'bg-gray-500/10 border-gray-500': status === 'idle',
})} />React vs Other Frameworks with Tailwind CSS
| Feature | React + Tailwind | Vue + Tailwind | Svelte + Tailwind |
|---|---|---|---|
| Class Attribute | className | class | class |
| Conditional Classes | clsx / template literals | :class binding | class: directive |
| Setup Plugin | @tailwindcss/vite | @tailwindcss/vite | @tailwindcss/vite |
| SSR Support | ✓ Next.js | ✓ Nuxt | ✓ SvelteKit |
| Component Libraries | Headless UI, Shadcn | Headless UI | Skeleton |
Frequently Asked Questions
Explore Tailwind CSS component libraries for pre-built React components, or use the cheat sheet for quick class lookups.