CSS Cheatsheet
Grid
Use this CSS reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.
Enabling Grid
.container {
display: grid;
display: inline-grid;
}
/* Direct children are grid items */Defining Columns and Rows
/* grid-template-columns */ grid-template-columns: 200px 1fr 200px; grid-template-columns: repeat(3, 1fr); /* 3 equal columns */ grid-template-columns: repeat(3, 1fr 2fr); /* 6 columns alternating */ grid-template-columns: repeat(auto-fill, 200px); /* as many 200px cols as fit */ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); /* responsive */ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); /* collapse empties */ grid-template-columns: [sidebar-start] 260px [sidebar-end main-start] 1fr [main-end]; /* grid-template-rows */ grid-template-rows: auto; grid-template-rows: 80px 1fr auto; grid-template-rows: repeat(4, minmax(100px, auto)); /* shorthand: rows / columns */ grid-template: 80px 1fr / 200px 1fr;
fr Unit and minmax()
/* fr = fraction of remaining free space */ grid-template-columns: 1fr 2fr; /* 1/3 and 2/3 */ /* minmax(min, max) */ grid-template-columns: minmax(200px, 1fr) 3fr; grid-template-columns: minmax(0, 1fr); /* allow shrinking below content */ grid-template-rows: minmax(50px, auto);
repeat() and auto-fill vs auto-fit
/* auto-fill: always creates tracks, even empty ones */ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); /* auto-fit: collapses empty tracks, items stretch */ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
Gap
gap: 1rem; /* row and column gap */ gap: 1rem 2rem; /* row-gap column-gap */ row-gap: 1rem; column-gap: 2rem;
Named Template Areas
.layout {
display: grid;
grid-template-columns: 260px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
}
header { grid-area: header; }
aside { grid-area: sidebar; }
main { grid-area: main; }
footer { grid-area: footer; }
/* Use . for empty cells: "header . main" */grid-template Shorthand (rows / columns + areas)
grid-template: "header header" 80px "sidebar main" 1fr "footer footer" auto / 260px 1fr;
Placing Items with Line Numbers
/* grid-column: start / end (line numbers, 1-indexed) */ .item { grid-column: 1 / 3; /* spans columns 1 and 2 */ grid-column: 1 / -1; /* span all columns */ grid-column: 2 / span 2; /* start at 2, span 2 tracks */ grid-row: 1 / 3; grid-row: span 2; /* span 2 rows from auto-placed position */ } /* Longhand */ grid-column-start: 1; grid-column-end: 3; grid-row-start: 2; grid-row-end: 4;
Placing Items with Named Lines
.container {
grid-template-columns: [col-start] 1fr [col-mid] 1fr [col-end];
}
.item {
grid-column: col-start / col-end;
}grid-area Shorthand
/* row-start / col-start / row-end / col-end */ .item { grid-area: 1 / 2 / 3 / 4; } /* Named area */ .item { grid-area: sidebar; }
Auto Placement — grid-auto-flow
grid-auto-flow: row; /* default — fills rows first */ grid-auto-flow: column; /* fills columns first */ grid-auto-flow: row dense; /* fill gaps with smaller items */ grid-auto-flow: column dense;
Implicit Grid Tracks — grid-auto-rows/columns
/* Size of auto-created tracks */ grid-auto-rows: 200px; grid-auto-rows: minmax(100px, auto); grid-auto-columns: 1fr;
grid Shorthand (Full)
/* grid: rows / columns */ grid: 80px 1fr / repeat(3, 1fr); /* grid: auto-flow settings */ grid: auto-flow dense 200px / 1fr; /* auto rows of 200px */ grid: repeat(3, 1fr) / auto-flow; /* auto columns */
Alignment — Container Level
/* Aligns items within their cells */ justify-items: start | end | center | stretch; /* inline/column axis */ align-items: start | end | center | stretch; /* block/row axis */ place-items: center; /* shorthand: align-items justify-items */ /* Aligns the grid tracks within the container (when grid < container) */ justify-content: start | end | center | stretch | space-between | space-around | space-evenly; align-content: start | end | center | stretch | space-between | space-around | space-evenly; place-content: space-between center; /* shorthand: align-content justify-content */
Alignment — Item Level
.item {
justify-self: start | end | center | stretch;
align-self: start | end | center | stretch;
place-self: center; /* shorthand: align-self justify-self */
}Subgrid
.grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; } .card { grid-column: span 2; display: grid; grid-template-columns: subgrid; /* inherits parent column tracks */ grid-template-rows: subgrid; /* inherits parent row tracks */ }
Masonry Layout (experimental)
.masonry {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: masonry; /* Chrome/Edge flag, Firefox: -moz- */
}Common Grid Patterns
Holy Grail Layout
.page {
display: grid;
grid-template:
"header" auto
"main" 1fr
"footer" auto
/ 1fr;
min-height: 100vh;
}
@media (min-width: 768px) {
.page {
grid-template:
"header header header" auto
"sidebar main aside" 1fr
"footer footer footer" auto
/ 200px 1fr 160px;
}
}Responsive Card Grid
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 1.5rem;
}Centered Container with Side Margins
.layout {
display: grid;
grid-template-columns:
[full-start] minmax(1rem, 1fr)
[content-start] min(65ch, 100%) [content-end]
minmax(1rem, 1fr) [full-end];
}
.full-bleed { grid-column: full-start / full-end; }
.content { grid-column: content-start / content-end; }12-Column Grid
.grid-12 { display: grid; grid-template-columns: repeat(12, 1fr); gap: 1rem; } .col-6 { grid-column: span 6; } .col-4 { grid-column: span 4; } .col-3 { grid-column: span 3; }
Named Repeat
grid-template-columns: repeat(4, [col-start] 1fr [col-end]); /* creates col-start 1..4 and col-end 1..4 */ .span-two { grid-column: col-start 2 / col-end 3; }
CSS Grid Inspector Tips
- Browsers show line numbers on hover in DevTools grid overlay.
- Named areas show text labels in the overlay.
densepacking fills gaps but changes visual order (check accessibility).