Tailwind CSS makes building responsive designs intuitive and efficient. Let's explore the best practices for creating mobile-first responsive layouts:
Tailwind CSS follows a mobile-first approach. Start with mobile styles and progressively enhance for larger screens:
<!-- Mobile-first responsive design -->
<div class="p-4 md:p-8 lg:p-12">
<h1 class="text-2xl md:text-4xl lg:text-6xl font-bold">
Responsive Heading
</h1>
</div>
Create flexible grid systems:
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
<div class="bg-white p-6 rounded-lg shadow-md">
Card 1
</div>
<!-- More cards -->
</div>
<div class="@container">
<div class="@lg:flex @lg:items-center @lg:gap-4">
<img class="@lg:w-1/3" src="..." alt="...">
<div class="@lg:w-2/3">
<h2 class="@lg:text-xl">Title</h2>
<p>Description</p>
</div>
</div>
</div>
<nav class="flex items-center justify-between p-4">
<div class="text-xl font-bold">Logo</div>
<!-- Mobile menu button -->
<button class="md:hidden">
<svg>...</svg>
</button>
<!-- Desktop navigation -->
<div class="hidden md:flex space-x-6">
<a href="#">Home</a>
<a href="#">About</a>
<a href="#">Contact</a>
</div>
</nav>
<section class="relative h-screen flex items-center justify-center bg-gradient-to-br from-blue-500 to-purple-600">
<div class="text-center text-white px-4">
<h1 class="text-4xl md:text-6xl lg:text-8xl font-bold mb-4">
Welcome
</h1>
<p class="text-lg md:text-xl lg:text-2xl mb-8 max-w-2xl mx-auto">
Build amazing responsive websites
</p>
<button class="bg-white text-blue-600 px-6 py-3 md:px-8 md:py-4 rounded-full font-semibold hover:bg-gray-100 transition">
Get Started
</button>
</div>
</section>
<!-- Responsive spacing with space-y -->
<div class="space-y-4 md:space-y-6 lg:space-y-8">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
<!-- Responsive grid gaps -->
<div class="grid grid-cols-2 gap-2 md:gap-4 lg:gap-6 xl:gap-8">
<!-- Grid items -->
</div>
<!-- Dashboard layout -->
<div class="min-h-screen bg-gray-100">
<!-- Header -->
<header class="bg-white shadow-sm border-b">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-16">
<div class="flex items-center">
<h1 class="text-2xl font-semibold">Dashboard</h1>
</div>
<div class="flex items-center space-x-4">
<button class="p-2 rounded-md hover:bg-gray-100">
Notifications
</button>
</div>
</div>
</div>
</header>
<!-- Main content -->
<div class="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<!-- Cards -->
</div>
</div>
</div>
| Breakpoint | Min Width | Use Case |
|---|---|---|
sm |
640px | Large phones |
md |
768px | Tablets |
lg |
1024px | Laptops |
xl |
1280px | Desktops |
2xl |
1536px | Large screens |
Extend Tailwind's default breakpoints:
// tailwind.config.js
module.exports = {
theme: {
screens: {
'xs': '475px',
'sm': '640px',
'md': '768px',
'lg': '1024px',
'xl': '1280px',
'2xl': '1400px',
'3xl': '1600px',
},
extend: {
spacing: {
'18': '4.5rem',
'88': '22rem',
},
fontSize: {
'xxs': '0.625rem',
}
}
}
}
// Button component with variants
const Button = ({ variant, size, children, ...props }) => {
const baseClasses = 'font-medium rounded-lg transition-colors duration-200';
const variants = {
primary: 'bg-blue-600 hover:bg-blue-700 text-white',
secondary: 'bg-gray-200 hover:bg-gray-300 text-gray-900',
ghost: 'hover:bg-gray-100 text-gray-700'
};
const sizes = {
sm: 'px-3 py-1.5 text-sm',
md: 'px-4 py-2',
lg: 'px-6 py-3 text-lg'
};
const classes = `${baseClasses} ${variants[variant]} ${sizes[size]}`;
return (
<button className={classes} {...props}>
{children}
</button>
);
};
const Card = ({ children, className = '', ...props }) => {
return (
<div
className={`bg-white rounded-lg shadow-md p-6 ${className}`}
{...props}
>
{children}
</div>
);
};
const CardHeader = ({ children, className = '' }) => (
<div className={`border-b border-gray-200 pb-4 mb-4 ${className}`}>
{children}
</div>
);
const CardTitle = ({ children, className = '' }) => (
<h3 className={`text-lg font-semibold text-gray-900 ${className}`}>
{children}
</h3>
);
// tailwind.config.js
module.exports = {
darkMode: 'class', // or 'media'
theme: {
extend: {
colors: {
dark: {
bg: '#1a1a1a',
surface: '#2d2d2d',
text: '#f5f5f5'
}
}
}
}
}
<!-- Dark mode classes -->
<div class="bg-white dark:bg-dark-bg text-gray-900 dark:text-dark-text">
<h1 class="text-2xl font-bold">Title</h1>
<p class="text-gray-600 dark:text-gray-300">Description</p>
</div>
// tailwind.config.js
module.exports = {
content: [
'./pages/**/*.{js,ts,jsx,tsx}',
'./components/**/*.{js,ts,jsx,tsx}',
'./app/**/*.{js,ts,jsx,tsx}',
],
// Rest of config
}
/* Instead of repeating classes */
@layer components {
.btn-primary {
@apply bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded-lg transition-colors;
}
.card {
@apply bg-white rounded-lg shadow-md p-6 border border-gray-200;
}
}
// tailwind.config.js
module.exports = {
mode: 'jit',
// Enables arbitrary value support
// class="top-[117px] left-[344px]"
// class="bg-[#1da1f2]"
}
<!-- Focus states -->
<button class="focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2">
Accessible Button
</button>
<!-- Screen reader utilities -->
<span class="sr-only">Screen reader only text</span>
<!-- High contrast mode -->
<div class="border border-gray-300 forced-colors:border-[ButtonBorder]">
Content
</div>
Tailwind CSS provides the perfect balance of utility and flexibility for responsive design, enabling you to build beautiful, maintainable interfaces quickly.