When building modern websites and web applications, layouts play a crucial role in creating intuitive, responsive, and visually appealing user experiences. Whether it’s a navigation bar, a product grid, or a landing page hero section, having full control over how elements are positioned and adapt across screen sizes is essential.
This is where Tailwind CSS shines. Its utility-first approach gives developers the power of Flexbox and CSS Grid directly in their markup, without writing custom CSS. By mastering Tailwind’s layout utilities, you can build pixel-perfect and highly responsive UIs in no time.
In this tutorial, we’ll dive deep into:
-
How to use Flexbox utilities in Tailwind for one-dimensional layouts (rows and columns).
-
How to use Grid utilities for two-dimensional layouts (rows × columns).
-
How to make layouts responsive using Tailwind’s breakpoint system.
-
Best practices for choosing between Flex and Grid.
By the end, you’ll have a strong foundation to build everything from simple navbars to complex dashboards—all with just Tailwind classes.
Setup Tailwind CSS
Before we jump into layouts, let’s set up a fresh project with Tailwind CSS.
1. Create a New Project
You can use any frontend setup, but the quickest way is with Vite:
npm create vite@latest tailwind-layouts
cd tailwind-layouts
npm install
Choose a framework (React, Vue, or Vanilla). For this tutorial, we’ll use React with Vite, but the Tailwind setup works the same for any option.
2. Install Tailwind CSS
Run the following command to install Tailwind and its dependencies:
npm install tailwindcss @tailwindcss/vite
Add an @import
to your CSS file that imports Tailwind CSS.
@import "tailwindcss";
3. Configure Tailwind
Add the @tailwindcss/vite
plugin to your Vite configuration vite.config.ts
.
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
// https://vite.dev/config/
export default defineConfig({
plugins: [react(), tailwindcss()],
})
4. Add Tailwind to CSS
Open your main CSS file (e.g., src/index.css
) and add the Tailwind directives:
@import "tailwindcss";
5. Start the Dev Server
Run your dev server to verify everything works:
npm run dev
Now you have Tailwind CSS fully integrated, and we’re ready to start building layouts with Flexbox and Grid.
Flexbox with Tailwind
Flexbox is perfect for building one-dimensional layouts—either arranging items in a row or stacking them in a column. Tailwind makes working with Flexbox intuitive by providing utility classes that directly map to CSS properties.
Core Flexbox Utilities
Here are some of the most commonly used Tailwind classes for Flexbox:
Class | Purpose |
---|---|
flex |
Turns an element into a flex container |
flex-row |
Aligns items horizontally (default) |
flex-col |
Aligns items vertically |
justify-start / justify-center / justify-end / justify-between / justify-around |
Controls horizontal alignment |
items-start / items-center / items-end |
Controls vertical alignment |
gap-x-* / gap-y-* |
Adds spacing between flex items |
Example 1: Simple Navbar
Let’s build a basic navbar using Tailwind’s flex utilities. Create a new file:
src/components/Navbar.tsx
const Navbar = () => {
return (
<nav className="flex justify-between items-center p-4 bg-blue-600 text-white">
<div className="text-xl font-bold">MyApp</div>
<ul className="flex gap-6">
<li><a href="#">Home</a></li>
<li><a href="#">Features</a></li>
<li><a href="#">Pricing</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
);
};
export default Navbar;
Open src/App.tsx
and replace the boilerplate with:
import Navbar from "./components/Navbar";
function App() {
return (
<div>
<Navbar />
</div>
);
}
export default App;
🔍 Explanation:
-
flex justify-between items-center
→ Places logo on the left, nav links on the right, and centers them vertically. -
gap-6
→ Adds spacing between list items.
Example 2: Responsive Navbar (Mobile → Desktop)
Now let’s make the navbar responsive. On small screens, the links will stack in a column. On medium+ screens, they’ll display in a row.
const ResponsiveNavbar = () => {
return (
<nav className="flex flex-col md:flex-row md:justify-between md:items-center p-4 bg-blue-600 text-white">
<div className="text-xl font-bold mb-2 md:mb-0">MyApp</div>
<ul className="flex flex-col md:flex-row gap-4 md:gap-6">
<li><a href="#">Home</a></li>
<li><a href="#">Features</a></li>
<li><a href="#">Pricing</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
);
};
export default ResponsiveNavbar;
Update src/App.tsx
:
import ResponsiveNavbar from "./components/ResponsiveNavbar";
function App() {
return (
<div>
<ResponsiveNavbar />
</div>
);
}
export default App;
🔍 Explanation:
-
flex-col md:flex-row
→ Stacks elements vertically on mobile, switches to row layout on medium+ screens. -
mb-2 md:mb-0
→ Adds bottom margin on mobile, removes it on desktop. -
gap-4 md:gap-6
→ Smaller gaps on mobile, larger gaps on desktop.
This pattern is very common when building responsive navigation bars.
✅ With Flexbox, you can quickly align and distribute elements along a single axis. Next, we’ll explore Grid layouts, which give you two-dimensional control for building things like product listings or dashboards.
Grid with Tailwind
Unlike Flexbox (which is 1D), CSS Grid allows you to control both rows and columns, making it perfect for dashboards, product listings, or galleries.
Core Grid Utilities
Class | Purpose |
---|---|
grid |
Turns an element into a grid container |
grid-cols-* |
Defines number of columns |
grid-rows-* |
Defines number of rows |
col-span-* / row-span-* |
Allows items to span multiple columns or rows |
gap-* / gap-x-* / gap-y-* |
Adds spacing between grid items |
auto-cols-* / auto-rows-* |
Controls auto-sizing of columns/rows |
Example 1: Basic Grid (3 Columns)
Create a new file:
src/components/ProductGrid.tsx
const ProductGrid = () => {
return (
<div className="grid grid-cols-3 gap-6 p-6">
<div className="bg-blue-200 p-4 rounded-lg">Item 1</div>
<div className="bg-blue-300 p-4 rounded-lg">Item 2</div>
<div className="bg-blue-400 p-4 rounded-lg">Item 3</div>
<div className="bg-blue-500 p-4 rounded-lg">Item 4</div>
<div className="bg-blue-600 p-4 rounded-lg">Item 5</div>
<div className="bg-blue-700 p-4 rounded-lg">Item 6</div>
</div>
);
};
export default ProductGrid;
🔍 Explanation:
-
grid grid-cols-3
→ Creates 3 equal-width columns. -
gap-6
→ Adds consistent spacing between items. -
Each
div
is a grid item styled as a “card.”
Example 2: Responsive Product Grid
Now, let’s make it responsive so it adapts to screen sizes:
-
1 column on mobile
-
2 columns on tablets
-
4 columns on desktops
Update ProductGrid.tsx
:
const ProductGrid = () => {
return (
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 p-6">
{Array.from({ length: 8 }).map((_, i) => (
<div
key={i}
className="bg-blue-500 p-6 rounded-xl text-white text-center font-semibold"
>
Product {i + 1}
</div>
))}
</div>
);
};
export default ProductGrid;
🔍 Explanation:
-
grid-cols-1
→ Default 1 column. -
sm:grid-cols-2
→ Switch to 2 columns at thesm
breakpoint (640px). -
lg:grid-cols-4
→ Switch to 4 columns at thelg
breakpoint (1024px). -
Array.from({ length: 8 })
→ Generates 8 product cards dynamically.
3. Use in App.tsx
Import into your app:
import ProductGrid from "./components/ProductGrid";
function App() {
return (
<div>
<ProductGrid />
</div>
);
}
export default App;
✅ Now you have a responsive product grid that looks great across devices!
Responsiveness Explained
One of Tailwind’s superpowers is its mobile-first responsive design system. Instead of writing custom media queries, you just prefix classes with responsive breakpoints.
Tailwind’s Default Breakpoints
Prefix | Min Width | Typical Use |
---|---|---|
sm: |
640px | Small devices (phones in landscape) |
md: |
768px | Tablets |
lg: |
1024px | Laptops/desktops |
xl: |
1280px | Large desktops |
2xl: |
1536px | Extra-large screens |
📌 Tailwind applies styles mobile-first:
-
No prefix → applies to all screen sizes.
-
md:
→ applies at 768px and above. -
lg:
→ applies at 1024px and above, and so on.
Example: Responsive Hero Layout (Flex + Grid Combo)
Let’s build a hero section that:
-
Stacks content vertically on mobile.
-
Switches to a 2-column layout on larger screens.
-
Uses flex for alignment and grid for structured content.
Create a new file:
src/components/HeroSection.tsx
const HeroSection = () => {
return (
<section className="bg-gray-100 py-12 px-6">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 items-center max-w-6xl mx-auto">
{/* Left: Text Content */}
<div className="flex flex-col gap-6">
<h1 className="text-3xl md:text-5xl font-bold text-gray-900">
Build Responsive Layouts with Tailwind CSS
</h1>
<p className="text-gray-700 text-lg md:text-xl">
Master Flexbox and Grid utilities to create modern, responsive
designs without writing a single line of custom CSS.
</p>
<div className="flex gap-4">
<button className="px-6 py-3 bg-blue-600 text-white rounded-xl hover:bg-blue-700 transition">
Get Started
</button>
<button className="px-6 py-3 bg-gray-200 text-gray-800 rounded-xl hover:bg-gray-300 transition">
Learn More
</button>
</div>
</div>
{/* Right: Image */}
<div className="flex justify-center lg:justify-end">
<img
src="https://placehold.co/500x350"
alt="Hero Illustration"
className="rounded-2xl shadow-lg"
/>
</div>
</div>
</section>
);
};
export default HeroSection;
2. Use in App.tsx
Update your app to include the Hero section:
import HeroSection from "./components/HeroSection";
function App() {
return (
<div>
<HeroSection />
</div>
);
}
export default App;
🔍 How Responsiveness Works Here
-
grid grid-cols-1 lg:grid-cols-2
→ 1 column by default, 2 columns onlg
screens (≥1024px). -
text-3xl md:text-5xl
→ Heading scales up on medium+ screens. -
flex justify-center lg:justify-end
→ Centers the image on mobile, aligns it right on desktops.
✅ With just a few responsive prefixes, you’ve built a fully adaptive hero layout.
Flex vs Grid: When to Use Which?
Both Flexbox and Grid are powerful layout systems in Tailwind CSS, but they shine in different scenarios. Knowing when to use one over the other is key to building clean, maintainable UIs.
✅ Use Flexbox When…
-
You need a one-dimensional layout (row or column).
-
You’re aligning elements along a single axis (e.g., horizontal navbars, vertical sidebars).
-
You want to evenly distribute space between elements (
justify-between
,space-x-*
). -
Content size determines layout (e.g., buttons inside a toolbar).
Examples:
-
Navigation bars
-
Centering elements
-
Simple vertical/horizontal stacks
✅ Use Grid When…
-
You need a two-dimensional layout (rows and columns).
-
You want to explicitly define rows, columns, and gaps.
-
Elements need to span multiple rows or columns.
-
The layout structure is more important than the content size.
Examples:
-
Product listings
-
Image galleries
-
Dashboard layouts
📝 Quick Comparison
Feature | Flexbox | Grid |
---|---|---|
Axis | 1D (row OR column) | 2D (rows AND columns) |
Content-driven | Yes | No (structure-driven) |
Best for | Navbars, buttons, simple stacks | Grids, galleries, dashboards |
Alignment | Powerful cross-axis alignment | Precise control of both axes |
🔑 Best Practice
-
Start with Flexbox if the layout is linear and content-driven.
-
Use Grid for more structured, two-dimensional designs.
-
Often, you’ll use both together (e.g., Grid for page layout + Flexbox inside grid items for alignment).
Conclusion + Next Steps
In this tutorial, you’ve learned how to:
-
Build flexbox layouts with Tailwind (
flex
,justify-*
,items-*
). -
Build grid layouts (
grid-cols-*
,gap-*
,col-span-*
). -
Apply responsive prefixes (
sm:
,md:
,lg:
) to adapt layouts across devices. -
Decide between Flexbox vs Grid depending on the situation.
👉 Next Steps:
-
Try combining Flexbox and Grid in a real-world project (e.g., a landing page or admin dashboard).
-
Explore Tailwind UI or Flowbite for ready-made components.
-
Check out our other Tailwind tutorials like Dark Mode Toggle.
With these skills, you can confidently design responsive, modern layouts without writing a single line of custom CSS. 🎉
You can get the full source code on our GitHub.
That's just the basics. If you need more deep learning about HTML, CSS, JavaScript, or related, you can take the following cheap course:
- Web Development Certification Training
- JavaScript and JQuery Essentials Training and Certification
- Build Responsive Websites with Modern HTML & CSS with Sass
- Web Development with HTML and CSS for Beginners
- HTML5 CSS3 JavaScript Bootstrap & jQuery Masterclass 5 in 1
- Front-end Web developer MasterClass HTML CSS JavaScript
- Comprehensive HTML & CSS MCQs: From Basic to Advance
- JavaScript Basics and Core Concepts - Learn in Under 2 Hours
- Basic JavaScript practice tests
- Learn Pro Advanced Modern JavaScript Programming
- JavaScript Web Projects: 20 Projects to Build Your Portfolio
Thanks!