Mastering CSS Grid: A Complete Guide to Modern Layouts
CSS Grid is a powerful layout system that allows you to create complex, two-dimensional layouts with ease. It's one of the most significant additions to CSS in recent years, fundamentally changing how we approach web layout design.
What is CSS Grid?
CSS Grid is a two-dimensional layout system that lets you control both rows and columns simultaneously. Unlike Flexbox, which is primarily one-dimensional, Grid excels at creating complex layouts where you need precise control over both axes.
Grid vs Flexbox
While both are layout tools, they serve different purposes:
- Grid: Best for two-dimensional layouts (rows and columns)
- Flexbox: Best for one-dimensional layouts (either row or column)
- Together: They work great together! Use Grid for overall page layout and Flexbox for component alignment
Basic Grid Concepts
Grid Container and Grid Items
.grid-container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: auto;
gap: 20px;
}
.grid-item {
background-color: #f0f0f0;
padding: 20px;
text-align: center;
}
<div class="grid-container">
<div class="grid-item">Item 1</div>
<div class="grid-item">Item 2</div>
<div class="grid-item">Item 3</div>
</div>
Grid Lines and Tracks
Grid creates invisible lines that form the structure:
- Grid Lines: The dividing lines between rows and columns
- Grid Tracks: The space between two adjacent grid lines
- Grid Areas: The space surrounded by four grid lines
Creating Grid Layouts
Defining Columns and Rows
.grid {
display: grid;
/* Define columns */
grid-template-columns: 200px 1fr 100px;
/* Define rows */
grid-template-rows: 60px 1fr 40px;
/* Shorthand */
grid-template: 60px 1fr 40px / 200px 1fr 100px;
}
Using Fractional Units (fr)
The fr
unit represents a fraction of the available space:
.grid {
display: grid;
grid-template-columns: 1fr 2fr 1fr; /* 1:2:1 ratio */
}
Repeat Function
Create repetitive patterns easily:
.grid {
display: grid;
/* Create 12 equal columns */
grid-template-columns: repeat(12, 1fr);
/* Mix with other units */
grid-template-columns: repeat(3, 1fr) 200px;
/* Auto-fit and auto-fill */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
Placing Grid Items
Line-based Placement
.grid-item {
/* Using line numbers */
grid-column: 1 / 3;
grid-row: 2 / 4;
/* Using span */
grid-column: span 2;
grid-row: span 2;
/* Shorthand */
grid-area: 2 / 1 / 4 / 3; /* row-start / column-start / row-end / column-end */
}
Named Lines
.grid {
display: grid;
grid-template-columns: [sidebar-start] 200px [sidebar-end main-start] 1fr [main-end];
}
.sidebar {
grid-column: sidebar-start / sidebar-end;
}
.main {
grid-column: main-start / main-end;
}
Named Areas
.grid {
display: grid;
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
grid-template-columns: 200px 1fr 1fr;
grid-template-rows: 60px 1fr 40px;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
Responsive Grid Layouts
Auto-fit and Auto-fill
.responsive-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
Media Queries with Grid
.grid {
display: grid;
grid-template-columns: 1fr;
gap: 20px;
}
@media (min-width: 768px) {
.grid {
grid-template-columns: 1fr 1fr;
}
}
@media (min-width: 1024px) {
.grid {
grid-template-columns: repeat(3, 1fr);
}
}
Advanced Grid Techniques
Implicit vs Explicit Grid
.grid {
display: grid;
/* Explicit grid */
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 100px 200px;
/* Implicit grid (for overflow items) */
grid-auto-rows: 150px;
grid-auto-columns: 1fr;
grid-auto-flow: row; /* or column */
}
Dense Grid Packing
.grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-flow: row dense;
}
.large-item {
grid-column: span 2;
grid-row: span 2;
}
Subgrid (Coming Soon)
.grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
.subgrid {
display: grid;
grid-template-columns: subgrid; /* Inherits parent's columns */
}
Practical Examples
Card Layout
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
padding: 2rem;
}
.card {
background: white;
border-radius: 8px;
padding: 1.5rem;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
Holy Grail Layout
.holy-grail {
display: grid;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
grid-template-columns: 200px 1fr 150px;
grid-template-rows: 60px 1fr 40px;
min-height: 100vh;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
Browser Support and Fallbacks
CSS Grid has excellent browser support, but for older browsers:
.grid {
/* Fallback for older browsers */
display: flex;
flex-wrap: wrap;
/* Modern browsers */
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}
/* Feature query for progressive enhancement */
@supports (display: grid) {
.grid {
display: grid;
/* Grid-specific properties */
}
}
Common Grid Patterns
Centering Items
.center-grid {
display: grid;
place-items: center; /* Centers both horizontally and vertically */
}
Stretching Items
.stretch-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
align-items: stretch; /* Stretch vertically */
justify-items: stretch; /* Stretch horizontally */
}
Conclusion
CSS Grid is a game-changer for web layout. It provides the tools to create complex, responsive layouts with clean, maintainable code. While it might seem complex at first, mastering Grid will significantly improve your CSS skills and open up new possibilities for creative layouts.
Start with simple examples and gradually work your way up to more complex layouts. The key is practice and experimentation. Don't be afraid to try different approaches and see what works best for your specific use case.
Happy coding!