CSS Grid is the most powerful layout system in CSS, perfect for creating two-dimensional layouts with precise control over both rows and columns. With Tailwind's grid utilities, you can build complex grid layouts without writing custom CSS. In this lesson, you'll master grid containers, columns, rows, gaps, and item placement to create professional layouts with ease.
Grid Basics
Just like Flexbox, everything starts by creating a grid container:
<!-- Create a grid container -->
<div class="grid">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
<!-- Without defining columns, items stack vertically (like block elements) -->But unlike Flexbox, Grid excels at creating two-dimensional layouts where you control both rows AND columns simultaneously.
Grid vs Flexbox Quick Comparison
- Flexbox: One-dimensional (row OR column)
- Grid: Two-dimensional (rows AND columns)
- Flexbox: Content-first (items determine layout)
- Grid: Layout-first (grid determines item size)
Grid Columns
Use grid-cols-* to define how many columns your grid should have:
Basic Column Grids
<!-- 2 equal columns -->
<div class="grid grid-cols-2 gap-4">
<div class="bg-blue-500 text-white p-4">Column 1</div>
<div class="bg-blue-500 text-white p-4">Column 2</div>
</div>
<!-- 3 equal columns -->
<div class="grid grid-cols-3 gap-4">
<div class="bg-green-500 text-white p-4">1</div>
<div class="bg-green-500 text-white p-4">2</div>
<div class="bg-green-500 text-white p-4">3</div>
</div>
<!-- 4 equal columns -->
<div class="grid grid-cols-4 gap-4">
<div class="bg-purple-500 text-white p-4">1</div>
<div class="bg-purple-500 text-white p-4">2</div>
<div class="bg-purple-500 text-white p-4">3</div>
<div class="bg-purple-500 text-white p-4">4</div>
</div>Available column utilities:
grid-cols-1- Single columngrid-cols-2throughgrid-cols-12- 2 to 12 equal columnsgrid-cols-none- No explicit column definition
Responsive Columns
Change column count based on screen size:
<!-- 1 column on mobile, 2 on tablet, 3 on desktop, 4 on large screens -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
<div class="bg-blue-500 text-white p-4">Item 1</div>
<div class="bg-blue-500 text-white p-4">Item 2</div>
<div class="bg-blue-500 text-white p-4">Item 3</div>
<div class="bg-blue-500 text-white p-4">Item 4</div>
<div class="bg-blue-500 text-white p-4">Item 5</div>
<div class="bg-blue-500 text-white p-4">Item 6</div>
</div>
<!-- Mobile: stacked vertically
Tablet: 2 columns
Desktop: 3 columns
Large screens: 4 columns -->📱 Mobile-First Pattern
Always start with 1 column (grid-cols-1) for mobile, then add breakpoints for larger screens. This ensures your layout works on all devices!
Grid Rows
While columns are more common, you can also explicitly define rows:
<!-- 3 rows with specific heights -->
<div class="grid grid-rows-3 gap-4 h-96">
<div class="bg-blue-500 text-white p-4">Row 1</div>
<div class="bg-green-500 text-white p-4">Row 2</div>
<div class="bg-purple-500 text-white p-4">Row 3</div>
</div>
<!-- Combine rows and columns -->
<div class="grid grid-cols-2 grid-rows-2 gap-4">
<div class="bg-orange-500 text-white p-4">1</div>
<div class="bg-orange-500 text-white p-4">2</div>
<div class="bg-orange-500 text-white p-4">3</div>
<div class="bg-orange-500 text-white p-4">4</div>
</div>Available row utilities:
grid-rows-1throughgrid-rows-6grid-rows-none
Most grids don't need explicit rows. Grid automatically creates rows as needed for your content. Explicit rows are mainly useful for specific layouts like dashboards.
Gap Utilities
Gap creates space between grid items (both rows and columns):
<!-- Equal gap on all sides -->
<div class="grid grid-cols-3 gap-4">
<div class="bg-blue-500 p-4">1</div>
<div class="bg-blue-500 p-4">2</div>
<div class="bg-blue-500 p-4">3</div>
</div>
<!-- Different row and column gaps -->
<div class="grid grid-cols-3 gap-x-8 gap-y-4">
<div class="bg-green-500 p-4">1</div>
<div class="bg-green-500 p-4">2</div>
<div class="bg-green-500 p-4">3</div>
<div class="bg-green-500 p-4">4</div>
<div class="bg-green-500 p-4">5</div>
<div class="bg-green-500 p-4">6</div>
</div>
<!-- No gap -->
<div class="grid grid-cols-3 gap-0">
<div class="bg-purple-500 p-4">1</div>
<div class="bg-purple-500 p-4">2</div>
<div class="bg-purple-500 p-4">3</div>
</div>Gap utilities:
gap-*- Gap for both rows and columnsgap-x-*- Gap between columns onlygap-y-*- Gap between rows only
💡 Gap vs Margin
Use gap instead of margins for grid spacing:
- ✅ Gap: Only adds space between items
- ❌ Margin: Adds space on all sides (including edges)
Column Spanning
Make items span across multiple columns with col-span-*:
<div class="grid grid-cols-4 gap-4">
<!-- Spans 2 columns -->
<div class="col-span-2 bg-blue-500 text-white p-4">
Spans 2 columns
</div>
<!-- Regular items (1 column each) -->
<div class="bg-green-500 text-white p-4">1 col</div>
<div class="bg-green-500 text-white p-4">1 col</div>
<!-- Spans 3 columns -->
<div class="col-span-3 bg-purple-500 text-white p-4">
Spans 3 columns
</div>
<!-- Regular item -->
<div class="bg-orange-500 text-white p-4">1 col</div>
<!-- Spans all 4 columns -->
<div class="col-span-4 bg-pink-500 text-white p-4">
Spans full width (4 columns)
</div>
</div>Available column span utilities:
col-span-1throughcol-span-12col-span-full- Span all columnscol-auto- Auto-sized column
Responsive Spanning
<!-- Spans 1 column on mobile, 2 on tablet, 3 on desktop -->
<div class="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-6 gap-4">
<div class="col-span-1 md:col-span-2 lg:col-span-3 bg-blue-500 text-white p-4">
Responsive spanning
</div>
<div class="bg-green-500 text-white p-4">Item</div>
<div class="bg-green-500 text-white p-4">Item</div>
<div class="bg-green-500 text-white p-4">Item</div>
</div>Row Spanning
Similarly, make items span across multiple rows:
<div class="grid grid-cols-3 grid-rows-3 gap-4">
<!-- Spans 2 rows -->
<div class="row-span-2 bg-blue-500 text-white p-4">
Spans 2 rows
</div>
<div class="bg-green-500 text-white p-4">Item</div>
<div class="bg-green-500 text-white p-4">Item</div>
<div class="bg-green-500 text-white p-4">Item</div>
<div class="bg-green-500 text-white p-4">Item</div>
<!-- Spans 3 rows -->
<div class="row-span-3 bg-purple-500 text-white p-4">
Spans 3 rows
</div>
<div class="bg-orange-500 text-white p-4">Item</div>
<div class="bg-orange-500 text-white p-4">Item</div>
<div class="bg-orange-500 text-white p-4">Item</div>
</div>Available row span utilities:
row-span-1throughrow-span-6row-span-full- Span all rowsrow-auto- Auto-sized row
Grid Start and End
For precise control, specify exactly where items start and end:
Column Start and End
<div class="grid grid-cols-4 gap-4">
<!-- Start at column 2, end at column 4 -->
<div class="col-start-2 col-end-4 bg-blue-500 text-white p-4">
Columns 2-3
</div>
<!-- Start at column 1, span to end -->
<div class="col-start-1 col-end-5 bg-green-500 text-white p-4">
Full width
</div>
</div>Row Start and End
<div class="grid grid-cols-3 grid-rows-3 gap-4">
<!-- Specific placement -->
<div class="col-start-1 col-end-3 row-start-1 row-end-3 bg-purple-500 text-white p-4">
Custom placement
</div>
<div class="bg-orange-500 text-white p-4">Item</div>
<div class="bg-orange-500 text-white p-4">Item</div>
<div class="bg-orange-500 text-white p-4">Item</div>
</div>Pro Tip: Grid lines are numbered starting from 1. If you have 3 columns, you have 4 column lines (before col 1, between cols, after col 3).
Grid Flow
Control how auto-placed items flow into the grid:
<!-- Row-dense: Fill rows, pack tightly -->
<div class="grid grid-cols-3 gap-4 grid-flow-row-dense">
<div class="col-span-2 bg-blue-500 text-white p-4">Wide item</div>
<div class="bg-green-500 text-white p-4">Item</div>
<div class="bg-green-500 text-white p-4">Item</div>
<div class="bg-green-500 text-white p-4">Item</div>
</div>
<!-- Column flow: Fill columns instead of rows -->
<div class="grid grid-cols-3 grid-rows-3 gap-4 grid-flow-col">
<div class="bg-purple-500 text-white p-4">1</div>
<div class="bg-purple-500 text-white p-4">2</div>
<div class="bg-purple-500 text-white p-4">3</div>
<div class="bg-purple-500 text-white p-4">4</div>
</div>Available flow utilities:
grid-flow-row- Fill rows (default)grid-flow-col- Fill columnsgrid-flow-dense- Pack items tightlygrid-flow-row-dense- Fill rows, pack tightlygrid-flow-col-dense- Fill columns, pack tightly
Auto-Fit and Auto-Fill
Create responsive grids that automatically adjust column count:
<!-- Note: These require arbitrary values in Tailwind -->
<!-- Minimum 250px columns, fill available space -->
<div class="grid gap-4" style="grid-template-columns: repeat(auto-fit, minmax(250px, 1fr))">
<div class="bg-blue-500 text-white p-4">Auto-sizing item</div>
<div class="bg-blue-500 text-white p-4">Auto-sizing item</div>
<div class="bg-blue-500 text-white p-4">Auto-sizing item</div>
<div class="bg-blue-500 text-white p-4">Auto-sizing item</div>
</div>
<!-- Or use Tailwind's arbitrary values -->
<div class="grid grid-cols-[repeat(auto-fit,minmax(250px,1fr))] gap-4">
<div class="bg-green-500 text-white p-4">Responsive</div>
<div class="bg-green-500 text-white p-4">Responsive</div>
<div class="bg-green-500 text-white p-4">Responsive</div>
</div>✨ Truly Responsive Grids
auto-fit and auto-fill create grids that automatically adjust based on available space—no media queries needed!
Interactive Grid Visualizer
Experiment with grid utilities to see how they work:
Grid Layout Explorer
Adjust columns, rows, and gaps to see how Grid works
Preview
Applied Classes
grid grid-cols-3 grid-rows-2 gap-4Column Spanning Example
💡 Grid Template
grid-cols-*- Number of columnsgrid-rows-*- Number of rowsgap-*- Space between items
💡 Grid Spanning
col-span-*- Span multiple columnsrow-span-*- Span multiple rowscol-start-*- Start at specific column
Practical Grid Examples
Example 1: Photo Gallery
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
<div class="aspect-square bg-gray-300 rounded-lg overflow-hidden">
<img src="photo1.jpg" alt="Photo" class="w-full h-full object-cover">
</div>
<div class="aspect-square bg-gray-300 rounded-lg overflow-hidden">
<img src="photo2.jpg" alt="Photo" class="w-full h-full object-cover">
</div>
<div class="col-span-2 row-span-2 bg-gray-300 rounded-lg overflow-hidden">
<img src="featured.jpg" alt="Featured" class="w-full h-full object-cover">
</div>
<div class="aspect-square bg-gray-300 rounded-lg overflow-hidden">
<img src="photo3.jpg" alt="Photo" class="w-full h-full object-cover">
</div>
<div class="aspect-square bg-gray-300 rounded-lg overflow-hidden">
<img src="photo4.jpg" alt="Photo" class="w-full h-full object-cover">
</div>
<div class="aspect-square bg-gray-300 rounded-lg overflow-hidden">
<img src="photo5.jpg" alt="Photo" class="w-full h-full object-cover">
</div>
<div class="aspect-square bg-gray-300 rounded-lg overflow-hidden">
<img src="photo6.jpg" alt="Photo" class="w-full h-full object-cover">
</div>
</div>Example 2: Dashboard Layout
<div class="grid grid-cols-1 lg:grid-cols-4 gap-6">
<!-- Header spans full width -->
<header class="col-span-1 lg:col-span-4 bg-white rounded-lg shadow p-6">
<h1 class="text-2xl font-bold">Dashboard</h1>
</header>
<!-- Sidebar spans 1 column on desktop -->
<aside class="lg:col-span-1 bg-white rounded-lg shadow p-6">
<nav class="space-y-2">
<a href="#" class="block p-2 hover:bg-gray-100 rounded">Overview</a>
<a href="#" class="block p-2 hover:bg-gray-100 rounded">Analytics</a>
<a href="#" class="block p-2 hover:bg-gray-100 rounded">Reports</a>
</nav>
</aside>
<!-- Main content spans 3 columns on desktop -->
<main class="lg:col-span-3 space-y-6">
<!-- Stats grid -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="bg-white rounded-lg shadow p-6">
<p class="text-sm text-gray-600">Total Sales</p>
<p class="text-3xl font-bold">$12,345</p>
</div>
<div class="bg-white rounded-lg shadow p-6">
<p class="text-sm text-gray-600">Customers</p>
<p class="text-3xl font-bold">1,234</p>
</div>
<div class="bg-white rounded-lg shadow p-6">
<p class="text-sm text-gray-600">Orders</p>
<p class="text-3xl font-bold">567</p>
</div>
</div>
<!-- Chart area -->
<div class="bg-white rounded-lg shadow p-6">
<h2 class="text-xl font-bold mb-4">Revenue Chart</h2>
<div class="h-64 bg-gray-100 rounded"></div>
</div>
</main>
</div>Example 3: Blog Post Grid
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<!-- Featured post spans 2 columns -->
<article class="md:col-span-2 bg-white rounded-lg shadow-lg overflow-hidden">
<img src="featured.jpg" alt="Featured" class="w-full h-64 object-cover">
<div class="p-6">
<span class="text-sm text-blue-600 font-semibold">Featured</span>
<h2 class="text-2xl font-bold mt-2 mb-3">
Main Article Title
</h2>
<p class="text-gray-600 mb-4">
Article excerpt goes here with a brief description...
</p>
<a href="#" class="text-blue-600 hover:underline">Read More →</a>
</div>
</article>
<!-- Regular posts -->
<article class="bg-white rounded-lg shadow overflow-hidden">
<img src="post1.jpg" alt="Post" class="w-full h-48 object-cover">
<div class="p-4">
<h3 class="font-bold mb-2">Article Title</h3>
<p class="text-sm text-gray-600">Brief excerpt...</p>
</div>
</article>
<article class="bg-white rounded-lg shadow overflow-hidden">
<img src="post2.jpg" alt="Post" class="w-full h-48 object-cover">
<div class="p-4">
<h3 class="font-bold mb-2">Article Title</h3>
<p class="text-sm text-gray-600">Brief excerpt...</p>
</div>
</article>
<article class="bg-white rounded-lg shadow overflow-hidden">
<img src="post3.jpg" alt="Post" class="w-full h-48 object-cover">
<div class="p-4">
<h3 class="font-bold mb-2">Article Title</h3>
<p class="text-sm text-gray-600">Brief excerpt...</p>
</div>
</article>
<article class="bg-white rounded-lg shadow overflow-hidden">
<img src="post4.jpg" alt="Post" class="w-full h-48 object-cover">
<div class="p-4">
<h3 class="font-bold mb-2">Article Title</h3>
<p class="text-sm text-gray-600">Brief excerpt...</p>
</div>
</article>
</div>Example 4: Product Grid
<!-- Responsive grid that auto-sizes -->
<div class="grid grid-cols-[repeat(auto-fill,minmax(280px,1fr))] gap-6">
<div class="bg-white rounded-lg shadow-lg overflow-hidden hover:shadow-xl transition">
<img src="product1.jpg" alt="Product" class="w-full h-64 object-cover">
<div class="p-4">
<h3 class="font-bold text-lg mb-2">Product Name</h3>
<p class="text-gray-600 text-sm mb-4">
Product description here...
</p>
<div class="flex items-center justify-between">
<span class="text-2xl font-bold text-blue-600">$99.99</span>
<button class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">
Add to Cart
</button>
</div>
</div>
</div>
<!-- Repeat for more products -->
<div class="bg-white rounded-lg shadow-lg overflow-hidden hover:shadow-xl transition">
<img src="product2.jpg" alt="Product" class="w-full h-64 object-cover">
<div class="p-4">
<h3 class="font-bold text-lg mb-2">Product Name</h3>
<p class="text-gray-600 text-sm mb-4">Product description...</p>
<div class="flex items-center justify-between">
<span class="text-2xl font-bold text-blue-600">$149.99</span>
<button class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">
Add to Cart
</button>
</div>
</div>
</div>
</div>Example 5: Holy Grail Layout
<div class="min-h-screen grid grid-rows-[auto_1fr_auto]">
<!-- Header -->
<header class="bg-white shadow-md p-6">
<h1 class="text-2xl font-bold">Site Header</h1>
</header>
<!-- Main content area with sidebar -->
<div class="grid grid-cols-1 lg:grid-cols-[250px_1fr_250px] gap-6 p-6">
<!-- Left sidebar -->
<aside class="bg-white rounded-lg shadow p-6">
<h2 class="font-bold mb-4">Left Sidebar</h2>
<nav class="space-y-2">
<a href="#" class="block hover:text-blue-600">Link 1</a>
<a href="#" class="block hover:text-blue-600">Link 2</a>
<a href="#" class="block hover:text-blue-600">Link 3</a>
</nav>
</aside>
<!-- Main content -->
<main class="bg-white rounded-lg shadow p-6">
<h2 class="text-2xl font-bold mb-4">Main Content</h2>
<p class="text-gray-600">Your main content goes here...</p>
</main>
<!-- Right sidebar -->
<aside class="bg-white rounded-lg shadow p-6">
<h2 class="font-bold mb-4">Right Sidebar</h2>
<div class="space-y-4">
<div class="bg-gray-100 p-4 rounded">Widget 1</div>
<div class="bg-gray-100 p-4 rounded">Widget 2</div>
</div>
</aside>
</div>
<!-- Footer -->
<footer class="bg-gray-800 text-white p-6">
<p class="text-center">© 2024 Your Company</p>
</footer>
</div>Common Grid Patterns
Memorize These Grid Patterns:
grid grid-cols-1 md:grid-cols-3 gap-6- Responsive card gridgrid grid-cols-[repeat(auto-fill,minmax(250px,1fr))]- Auto-sizing gridcol-span-full- Full-width element in gridgrid grid-cols-4 gap-4thencol-span-2- Mixed column widthsgrid place-items-center- Center all items
Grid Alignment
Control how items and content are aligned within the grid:
Justify Items (Horizontal)
<!-- Align items to start of their grid area -->
<div class="grid grid-cols-3 gap-4 justify-items-start">
<div class="bg-blue-500 text-white p-4">Start</div>
<div class="bg-blue-500 text-white p-4">Start</div>
<div class="bg-blue-500 text-white p-4">Start</div>
</div>
<!-- Center items -->
<div class="grid grid-cols-3 gap-4 justify-items-center">
<div class="bg-green-500 text-white p-4">Center</div>
<div class="bg-green-500 text-white p-4">Center</div>
<div class="bg-green-500 text-white p-4">Center</div>
</div>
<!-- Stretch items (default) -->
<div class="grid grid-cols-3 gap-4 justify-items-stretch">
<div class="bg-purple-500 text-white p-4">Stretch</div>
<div class="bg-purple-500 text-white p-4">Stretch</div>
<div class="bg-purple-500 text-white p-4">Stretch</div>
</div>Align Items (Vertical)
<div class="grid grid-cols-3 gap-4 h-64 items-start">
<div class="bg-blue-500 text-white p-4">Top</div>
<div class="bg-blue-500 text-white p-4">Top</div>
<div class="bg-blue-500 text-white p-4">Top</div>
</div>
<div class="grid grid-cols-3 gap-4 h-64 items-center">
<div class="bg-green-500 text-white p-4">Middle</div>
<div class="bg-green-500 text-white p-4">Middle</div>
<div class="bg-green-500 text-white p-4">Middle</div>
</div>
<div class="grid grid-cols-3 gap-4 h-64 items-end">
<div class="bg-purple-500 text-white p-4">Bottom</div>
<div class="bg-purple-500 text-white p-4">Bottom</div>
<div class="bg-purple-500 text-white p-4">Bottom</div>
</div>Place Items (Both Axes)
<!-- Center items both horizontally and vertically -->
<div class="grid grid-cols-3 gap-4 h-64 place-items-center">
<div class="bg-blue-500 text-white p-4">Centered</div>
<div class="bg-blue-500 text-white p-4">Centered</div>
<div class="bg-blue-500 text-white p-4">Centered</div>
</div>Practice Playground
Create your own grid layouts and experiment:
Build Your Grid Layout
Experiment with grid columns, spans, and gaps
Featured
This spans 2 columns
Key Takeaways
gridcreates a grid container for two-dimensional layoutsgrid-cols-*defines the number of columnsgap-*adds space between grid itemscol-span-*makes items span multiple columnsrow-span-*makes items span multiple rows- Use responsive breakpoints to change grid layouts per screen size
- Grid is perfect for two-dimensional layouts like dashboards and galleries
auto-fitandauto-fillcreate truly responsive grids- Combine Grid and Flexbox for maximum layout flexibility
What's Next?
You've conquered CSS Grid! Combined with Flexbox from the previous lesson, you now have complete mastery over layout in Tailwind CSS.
In the next lesson, we'll explore Spacing & Sizing Utilities—learning Tailwind's spacing scale and how to use padding, margin, width, and height utilities to create perfectly spaced layouts.
🎯 Practice Challenge!
Build a responsive photo gallery with a featured image that spans 2x2 grid cells, surrounded by smaller images. Make it work beautifully on mobile, tablet, and desktop!