Skip to content

Tailwind CSS - Grid Auto Flow

The grid-auto-flow utilities in Tailwind CSS control how elements are automatically placed within a CSS Grid layout. This is crucial for creating dynamic and responsive grids where the number of items might change.

When you define a grid container (e.g., using grid and grid-cols-3), grid items are typically placed automatically. The grid-auto-flow utilities let you specify the direction of this automatic placement (row or column) and the algorithm used to fill in gaps (dense).

ClassCSS PropertiesDescription
grid-flow-rowgrid-auto-flow: row;Places items by filling each row, then moving to the next. This is the default behavior.
grid-flow-colgrid-auto-flow: column;Places items by filling each column, then moving to the next.
grid-flow-row-densegrid-auto-flow: row dense;Uses the ‘dense’ packing algorithm along with row flow. It will attempt to fill holes in the grid with smaller items.
grid-flow-col-densegrid-auto-flow: column dense;Uses the ‘dense’ packing algorithm along with column flow, filling gaps in columns.

For modern development, it’s recommended to install Tailwind CSS via npm and use a build tool like Vite or Next.js. However, for these quick demonstrations, we’ll use the Tailwind Play CDN, which enables all modern features directly in the browser.

<!-- Add this script to your HTML head for demo purposes -->
<script src="https://cdn.tailwindcss.com"></script>

This example demonstrates the fundamental difference between grid-flow-row and grid-flow-col.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.tailwindcss.com"></script>
<title>Grid Auto Flow: Row vs. Column</title>
</head>
<body class="p-8 bg-slate-100 text-slate-800">
<h3 class="text-xl font-bold mb-4">1. grid-flow-row (Default)</h3>
<div class="grid grid-flow-row grid-cols-4 grid-rows-2 gap-4 mb-8">
<div class="bg-sky-500 rounded-lg p-4 font-mono text-white">1</div>
<div class="bg-sky-500 rounded-lg p-4 font-mono text-white">2</div>
<div class="bg-sky-500 rounded-lg p-4 font-mono text-white">3</div>
<div class="bg-sky-500 rounded-lg p-4 font-mono text-white">4</div>
<div class="bg-sky-500 rounded-lg p-4 font-mono text-white">5</div>
</div>
<h3 class="text-xl font-bold mb-4">2. grid-flow-col</h3>
<div class="grid grid-flow-col grid-cols-4 grid-rows-2 gap-4">
<div class="bg-violet-500 rounded-lg p-4 font-mono text-white">1</div>
<div class="bg-violet-500 rounded-lg p-4 font-mono text-white">2</div>
<div class="bg-violet-500 rounded-lg p-4 font-mono text-white">3</div>
<div class="bg-violet-500 rounded-lg p-4 font-mono text-white">4</div>
<div class="bg-violet-500 rounded-lg p-4 font-mono text-white">5</div>
</div>
</body>
</html>

Example 2: The Power of ‘Dense’ Packing

Section titled “Example 2: The Power of ‘Dense’ Packing”

The dense utilities are powerful. Observe how grid-flow-row-dense fills the gap left by the large element. Without dense, item 03 would appear on the next line, leaving an empty space.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.tailwindcss.com"></script>
<title>Dense Packing</title>
</head>
<body class="p-8 bg-slate-100 text-slate-800">
<h3 class="text-xl font-bold mb-4">Without 'dense'</h3>
<div class="grid grid-cols-4 gap-4 mb-8">
<div class="col-span-2 row-span-2 bg-rose-500 rounded-lg flex items-center justify-center font-mono text-white text-2xl">01</div>
<div class="bg-rose-300 rounded-lg flex items-center justify-center font-mono text-white">02</div>
<!-- Note the gap here -->
<div class="bg-rose-300 rounded-lg flex items-center justify-center font-mono text-white">03</div>
<div class="bg-rose-300 rounded-lg flex items-center justify-center font-mono text-white">04</div>
</div>
<h3 class="text-xl font-bold mb-4">With 'grid-flow-row-dense'</h3>
<div class="grid grid-cols-4 grid-flow-row-dense gap-4">
<div class="col-span-2 row-span-2 bg-emerald-500 rounded-lg flex items-center justify-center font-mono text-white text-2xl">01</div>
<div class="bg-emerald-300 rounded-lg flex items-center justify-center font-mono text-white">02</div>
<!-- Item 03 fills the gap -->
<div class="bg-emerald-300 rounded-lg flex items-center justify-center font-mono text-white">03</div>
<div class="bg-emerald-300 rounded-lg flex items-center justify-center font-mono text-white">04</div>
</div>
</body>
</html>

You can change the flow direction based on screen size using responsive prefixes. For example, grid-flow-row lg:grid-flow-col will stack items in rows on small screens and switch to columns on large screens.

Best Practice: Use grid-flow-row for predictable, ordered content. Use grid-flow-col for horizontally scrolling lists. Use dense packing for image galleries or dashboards where visual density is more important than item order.