auto-fill / auto-fit
auto-fill / auto-fit
Level 6 — Layouts — CSS Grid Special count keywords used inside the
repeat()function to automatically generate as many column or row tracks as can fit in the grid container, enabling responsiveness without media queries.
1. Prerequisites
repeat()Function — These keywords are used exclusively insiderepeat().grid-template-columns/grid-template-rows— The properties they configure.
2. Term Category
Layout Property (Universal Modern Standard .): auto-fill / auto-fit is a fundamental concept in this technology stack. Level 6 — Layouts — CSS Grid
3. Explanation
(1) Design Motivation — "Why did we design this?"
In standard responsive web design, you have to write media queries to change column structures for different screens:
- On phone: 1 column
- On tablet: 2 columns
- On desktop: 4 columns
This requires writing three separate blocks of CSS.
What if the browser could do this calculation automatically?
What if you could just tell the container: "draw as many 200px columns as you can fit. If the screen is small, fit 1. If it grows, fit 4."
The W3C created auto-fill and auto-fit to solve this.
Used as the count parameter in the repeat() function, they instruct the browser to calculate column counts dynamically based on the container's width, eliminating media queries for standard grids.
(2) The Difference: auto-fill vs. auto-fit
The difference between the two keywords only appears when you have fewer items than the grid has space for (e.g. you have only 2 cards, but the wide desktop screen has space for 5 columns).
1. auto-fill (Fill with Empty Tracks)
The browser creates as many tracks of the specified size as fit.
- Even if there are no items to put in them, the empty tracks remain in the layout.
- Your two cards will sit on the left, and the remaining space will stay empty.
2. auto-fit (Collapse Empty Tracks)
The browser creates as many tracks as fit, but then collapses any empty tracks to 0px wide.
- The space of those empty tracks is redistributed to the active columns.
- Your two cards will stretch to fill the entire width of the container.
(3) The Dynamic Duo: auto-fit + minmax()
To build the classic responsive card grid, you combine auto-fit with the minmax() function (detailed in Term #60):
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
Translation: "Draw columns that are at least 250px wide. If there is extra space, let them grow. Wrap them automatically when they hit 250px bounds."
(4) Code Examples
Short Snippet
Auto-responsive grid (no media queries!):
.card-grid {
display: grid;
/* Columns automatically wrap and scale to fit container width */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
}
Fuller Example (Comparison Showcase)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Auto-Fill vs Auto-Fit</title>
<style>
.container {
width: 800px;
background-color: #ddd;
padding: 10px;
margin-bottom: 20px;
}
.item {
background-color: steelblue;
color: white;
padding: 15px;
font-weight: bold;
text-align: center;
}
/* Auto-Fill: keeps empty column slots */
.fill-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 10px;
}
/* Auto-Fit: stretches active items to fit whole row */
.fit-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 10px;
}
</style>
</head>
<body>
<h3>Auto-Fill (Leaves Empty Slots on Right)</h3>
<div class="container fill-grid">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>
</div>
<h3>Auto-Fit (Stretches Items to Fill Row)</h3>
<div class="container fit-grid">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>
</div>
</body>
</html>
4. Common Mistakes & Pitfalls
Mistake 1: Using 1fr directly inside auto-repeat
The mistake: Declaring repeat(auto-fit, 1fr):
/* BAD: Invalid syntax! Grid calculation will crash and default to single-column */
.grid {
grid-template-columns: repeat(auto-fit, 1fr);
}
Why it's wrong: The fr unit represents a fraction of flexible space. Because 1fr can shrink to 0px, the browser cannot calculate how many columns will fit.
To use auto-fit/fill, you must provide a minimum size constraint using fixed units (like pixels) or the minmax() helper.
Mistake 2: Confusing auto-fill with auto-fit in Responsive Grids
The mistake: Using auto-fill when you want a few items to stretch and fill the remaining row width on wide screens.
Why it's wrong: auto-fill creates empty virtual column tracks on wide screens when item count is small. auto-fit collapses empty tracks to 0px, allowing existing items to stretch across the full row.
Incorrect:
/* With 2 items on wide screen: auto-fill leaves empty blank column tracks */
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
Fix:
/* auto-fit collapses empty tracks, stretching items to fill full row width: */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
Mistake 3: Using auto-fill/auto-fit Without minmax() Function
The mistake: Writing grid-template-columns: repeat(auto-fit, 250px);.
Why it's wrong: Using fixed 250px without minmax() creates fixed columns that fail to stretch fluidly across remaining free space.
Incorrect:
grid-template-columns: repeat(auto-fit, 250px); /* ❌ Non-fluid fixed columns */
Fix:
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); /* Responsive fluid grid */
5. Practice Exercises
Exercise 1: Zero-Media-Query Fluid Responsive Grid Cards with auto-fit
Scenario: An author builds a responsive fluid product card grid that wraps and expands automatically without writing media queries.
Requirements:
- Apply
display: grid. - Use
grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr)). - Set
gap: 1.5rem.
Answer
Implementation
.fluid-card-grid {
display: grid;
/* Auto-fit: Fills available space, expanding columns to fill empty row space */
grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr));
gap: 1.5rem;
padding: 1.5rem;
}
Technical Explanation
- The
auto-fitKeyword: Creates as many grid tracks as can fit in the container, and EXPANDS existing columns to stretch across any leftover empty space. - Zero-Media-Query Responsiveness:
repeat(auto-fit, minmax(18rem, 1fr))creates a fully responsive multi-column layout without writing a single@mediabreakpoint! minmax(18rem, 1fr)Minimum Guard: Guarantees cards never shrink below18rem(288px) before wrapping to the next line.
Exercise 2: Comparing auto-fill vs auto-fit Column Expansion Behaviors
Scenario: Demonstrates the key behavioral difference between auto-fill and auto-fit when only a few items exist.
Requirements:
- Apply
auto-fillto.grid-fill. - Apply
auto-fitto.grid-fit.
Answer
Implementation
/* auto-fill: Creates empty ghost tracks if space permits; items stay at 18rem */
.grid-fill {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
}
/* auto-fit: Collapses empty tracks; 1 item stretches 100% across container width */
.grid-fit {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr));
}
Technical Explanation
auto-fillBehavior: Reserves empty grid tracks for future items; existing items maintain theirminmaxminimum size rather than stretching.auto-fitBehavior: Collapses empty grid tracks to 0px and stretches existing items to fill 100% of the row width.- Card Grid Best Practice: Use
auto-fitfor product galleries where single items should fill the top row nicely.
Exercise 3: Creating Empty Placeholder Tracks with auto-fill in Dashboards
Scenario: Uses auto-fill in dashboard grids to maintain fixed column grid alignments.
Requirements:
- Apply
auto-fillfor strict column alignment.
Answer
Implementation
.dashboard-metrics {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
gap: 1rem;
}
Technical Explanation
- Dashboard Alignment:
auto-fillmaintains consistent metric card widths even when only 1 or 2 widgets are active. - Grid Structure Stability: Prevents a single metric card from stretching awkwardly across the entire screen.
- Fluid Responsiveness: Wraps naturally when screen width drops below
14remper card.
6. Related Terms
repeat()Function — The loop container.minmax()Function — The required track bounds function.@media(Media Queries Basics) — The legacy responsive breakpoint method.
7. Key Takeaways
auto-fillandauto-fitreplace fixed loop counts insiderepeat().- They calculate columns dynamically based on the width of the container.
auto-fillpreserves empty column tracks, leaving gaps on the right.auto-fitcollapses empty tracks to0px, stretching the active items to fill the row.- They must be paired with fixed minimum track sizes (like
minmax(200px, 1fr)) to prevent calculations failure.