Complete Guide to HTML and CSS Grid Layout

Table of Contents

  1. Introduction to CSS Grid
  2. Grid Container Properties
  3. Grid Item Properties
  4. Grid Lines and Tracks
  5. Grid Areas
  6. Alignment and Spacing
  7. Responsive Grid Design
  8. Advanced Grid Techniques
  9. Grid vs Flexbox
  10. Browser Support and Fallbacks
  11. Practical Examples
  12. Best Practices

Introduction to CSS Grid

CSS Grid Layout is a two-dimensional layout system for the web. It allows you to create complex, responsive layouts with rows and columns simultaneously. Unlike Flexbox which is primarily one-dimensional, Grid gives you control over both dimensions.

Why CSS Grid?

/* Before Grid - Complex layouts required hacks */
.container {
display: flex;
flex-wrap: wrap;
}
.item {
width: calc(33.333% - 20px);
margin: 10px;
/* Still needed clearfix, margin calculations, etc. */
}
/* With Grid - Simple and intuitive */
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}

Basic Grid Example

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Basic Grid Example</title>
<style>
.grid-container {
display: grid;
grid-template-columns: 200px 1fr 200px;
grid-template-rows: auto 1fr auto;
gap: 20px;
min-height: 100vh;
padding: 20px;
background: #f0f0f0;
}
.header {
grid-column: 1 / -1;
background: #3498db;
color: white;
padding: 20px;
text-align: center;
}
.sidebar-left {
background: #2ecc71;
color: white;
padding: 20px;
}
.main-content {
background: #e74c3c;
color: white;
padding: 20px;
}
.sidebar-right {
background: #f39c12;
color: white;
padding: 20px;
}
.footer {
grid-column: 1 / -1;
background: #9b59b6;
color: white;
padding: 20px;
text-align: center;
}
</style>
</head>
<body>
<div class="grid-container">
<header class="header">Header</header>
<aside class="sidebar-left">Left Sidebar</aside>
<main class="main-content">Main Content</main>
<aside class="sidebar-right">Right Sidebar</aside>
<footer class="footer">Footer</footer>
</div>
</body>
</html>

Grid Container Properties

Display and Basic Setup

/* Grid container declaration */
.container {
display: grid;           /* Block-level grid */
display: inline-grid;    /* Inline-level grid */
}
/* Creating columns and rows */
.container {
display: grid;
grid-template-columns: 100px 200px 100px;     /* Three columns */
grid-template-rows: 100px 200px;               /* Two rows */
gap: 20px;                                      /* Gap between grid items */
}
/* Using different units */
.container {
display: grid;
grid-template-columns: 
100px              /* Fixed width */
20%                /* Percentage of container */
1fr                /* Fractional unit */
auto               /* Auto-sized */
minmax(100px, 1fr) /* Minimum 100px, maximum 1fr */
repeat(3, 1fr);    /* Repeat 3 times 1fr */
}

Grid Template Columns and Rows

/* Explicit grid definition */
.container {
display: grid;
/* Columns */
grid-template-columns: 200px 1fr 200px;
grid-template-columns: [start] 200px [center] 1fr [end] 200px; /* Named lines */
grid-template-columns: repeat(4, 1fr);  /* 4 equal columns */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
/* Rows */
grid-template-rows: 100px auto 100px;
grid-template-rows: [header-start] 100px [content-start] 1fr [footer-start] 100px;
/* Gap */
gap: 20px;                       /* Row and column gap */
row-gap: 20px;                    /* Only row gap */
column-gap: 20px;                  /* Only column gap */
}
/* Examples of different grid configurations */
.grid-examples {
/* Three equal columns */
grid-template-columns: 1fr 1fr 1fr;
/* Asymmetric columns */
grid-template-columns: 2fr 1fr 1fr;  /* First column twice as wide */
/* Mixed units */
grid-template-columns: 200px 1fr 2fr; /* Fixed, flexible, more flexible */
/* Named grid lines */
grid-template-columns: [left-edge] 1fr [main-start] 3fr [main-end] 1fr [right-edge];
/* Responsive columns */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}

The fr Unit

/* Understanding the fractional unit */
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;  /* Three equal columns */
grid-template-columns: 2fr 1fr 1fr;  /* 2:1:1 ratio */
grid-template-columns: 1fr 2fr;       /* 1:2 ratio */
}
/* fr vs percentage */
.percentage {
width: 100%;
display: grid;
grid-template-columns: 33.33% 33.33% 33.33%;
/* Problems with gaps - 33.33% * 3 + gaps > 100% */
}
.fr-unit {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 20px;
/* fr automatically accounts for gaps */
}

Repeat Function

/* The repeat() function */
.container {
display: grid;
/* Basic repeat */
grid-template-columns: repeat(4, 1fr);  /* 4 equal columns */
grid-template-rows: repeat(3, 100px);   /* 3 rows of 100px */
/* Repeat with pattern */
grid-template-columns: repeat(2, 1fr 2fr);  /* 1fr, 2fr, 1fr, 2fr */
/* Auto-fill vs Auto-fit */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
/* Auto-fill vs Auto-fit example */
.auto-fill-demo {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
gap: 20px;
/* Creates as many columns as possible, keeps empty tracks */
}
.auto-fit-demo {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
gap: 20px;
/* Creates as many columns as possible, collapses empty tracks */
}
/* Visual difference */
.auto-fill {
/* When fewer items, you'll see empty columns */
}
.auto-fit {
/* Items expand to fill available space */
}

Minmax Function

/* The minmax() function */
.container {
display: grid;
/* Column with minimum and maximum size */
grid-template-columns: minmax(100px, 1fr) 2fr;
/* Minimum 200px, can grow but not shrink below 200px */
grid-template-columns: minmax(200px, 1fr) 1fr;
/* Practical examples */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
/* Sidebar with min and max */
grid-template-columns: minmax(150px, 250px) 1fr;
}
/* Complex minmax examples */
.minmax-examples {
/* Column that's at least 100px but no more than 300px */
grid-template-columns: minmax(100px, 300px) 1fr;
/* Column that's at least 200px but can grow */
grid-template-columns: minmax(200px, auto) 1fr;
/* Column that's at most 500px but can shrink */
grid-template-columns: minmax(auto, 500px) 1fr;
/* With repeat */
grid-template-columns: repeat(3, minmax(150px, 300px));
}

Grid Item Properties

Grid Column and Row Placement

/* Grid item placement */
.item {
/* Column placement */
grid-column-start: 1;
grid-column-end: 3;
/* Shorthand */
grid-column: 1 / 3;
/* Row placement */
grid-row-start: 1;
grid-row-end: 3;
/* Shorthand */
grid-row: 1 / 3;
/* Combined shorthand */
grid-area: 1 / 1 / 3 / 3;  /* row-start / col-start / row-end / col-end */
}
/* Spanning items */
.item {
grid-column: span 2;        /* Span 2 columns */
grid-row: span 3;           /* Span 3 rows */
grid-area: span 2 / span 3; /* Span 2 rows and 3 columns */
}
/* Using named lines */
.item {
grid-column: main-start / main-end;
grid-row: content-start / footer-start;
}
/* Using named grid areas */
.item {
grid-area: header;
}

Spanning Examples

/* Complete spanning example */
.grid-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, 100px);
gap: 10px;
}
.item-1 {
grid-column: 1 / 3;        /* Spans columns 1-2 */
grid-row: 1 / 2;           /* Row 1 only */
}
.item-2 {
grid-column: 3 / -1;       /* Spans from column 3 to end */
grid-row: 1 / 2;
}
.item-3 {
grid-column: 1 / 2;
grid-row: 2 / 4;           /* Spans rows 2-3 */
}
.item-4 {
grid-column: 2 / 4;
grid-row: 2 / 3;
}
.item-5 {
grid-column: 4 / 5;
grid-row: 2 / 4;           /* Spans rows 2-3 */
}
.item-6 {
grid-column: 2 / 4;
grid-row: 3 / 4;
}

Grid Area Naming

/* Named grid areas - most intuitive approach */
.container {
display: grid;
grid-template-areas: 
"header header header"
"sidebar content content"
"sidebar footer footer";
grid-template-columns: 1fr 2fr 2fr;
grid-template-rows: auto 1fr auto;
gap: 20px;
}
/* Assigning items to named areas */
.header {
grid-area: header;
}
.sidebar {
grid-area: sidebar;
}
.content {
grid-area: content;
}
.footer {
grid-area: footer;
}
/* Complex area patterns */
.container {
grid-template-areas: 
"header header header header"
".      main   main   ."
"footer footer footer footer";
}
.container {
grid-template-areas: 
"logo    nav     nav     nav"
"sidebar content content content"
"sidebar footer footer footer";
}
/* Empty cells with dots */
.container {
grid-template-areas: 
"header header header header"
"sidebar .      .      widget"
"footer footer footer footer";
}

Grid Lines and Tracks

Working with Grid Lines

/* Understanding grid lines */
.container {
display: grid;
grid-template-columns: [col1-start] 1fr [col1-end col2-start] 2fr [col2-end col3-start] 1fr [col3-end];
grid-template-rows: [row1-start] 100px [row1-end row2-start] auto [row2-end];
}
/* Using line numbers */
.item {
grid-column: 1 / 3;        /* Lines 1 to 3 */
grid-row: 1 / -1;          /* From first to last line */
}
/* Using named lines */
.item {
grid-column: col1-start / col2-end;
grid-row: row1-start / row2-end;
}
/* Multiple named lines */
.container {
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;
}

Line-Based Placement Examples

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Grid Lines Example</title>
<style>
.grid {
display: grid;
grid-template-columns: [start] 1fr [content-start] 2fr [content-middle] 1fr [content-end] 1fr [end];
grid-template-rows: [top] 100px [middle] 200px [bottom] 100px [footer-end];
gap: 10px;
background: #f0f0f0;
padding: 10px;
}
.item {
background: #3498db;
color: white;
padding: 20px;
border-radius: 5px;
}
.item-1 {
grid-column: start / content-middle;
grid-row: top / middle;
}
.item-2 {
grid-column: content-middle / content-end;
grid-row: top / middle;
}
.item-3 {
grid-column: content-end / end;
grid-row: top / bottom;
}
.item-4 {
grid-column: start / content-middle;
grid-row: middle / bottom;
}
.item-5 {
grid-column: content-middle / content-end;
grid-row: middle / bottom;
}
.item-6 {
grid-column: start / end;
grid-row: bottom / footer-end;
}
</style>
</head>
<body>
<div class="grid">
<div class="item item-1">Item 1</div>
<div class="item item-2">Item 2</div>
<div class="item item-3">Item 3</div>
<div class="item item-4">Item 4</div>
<div class="item item-5">Item 5</div>
<div class="item item-6">Item 6</div>
</div>
</body>
</html>

Grid Areas

Creating Grid Areas

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Grid Areas Example</title>
<style>
.grid-container {
display: grid;
grid-template-areas: 
"header header header header"
"nav    main   main   sidebar"
"nav    main   main   ad"
"footer footer footer footer";
grid-template-columns: 150px 1fr 2fr 200px;
grid-template-rows: 80px 1fr 1fr 60px;
gap: 10px;
min-height: 100vh;
padding: 10px;
background: #f5f5f5;
}
.header {
grid-area: header;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 20px;
}
.nav {
grid-area: nav;
background: #3498db;
color: white;
padding: 20px;
}
.main {
grid-area: main;
background: #2ecc71;
color: white;
padding: 20px;
}
.sidebar {
grid-area: sidebar;
background: #f39c12;
color: white;
padding: 20px;
}
.ad {
grid-area: ad;
background: #e74c3c;
color: white;
padding: 20px;
}
.footer {
grid-area: footer;
background: #9b59b6;
color: white;
padding: 20px;
}
/* Responsive grid areas */
@media (max-width: 768px) {
.grid-container {
grid-template-areas: 
"header"
"nav"
"main"
"sidebar"
"ad"
"footer";
grid-template-columns: 1fr;
grid-template-rows: auto;
}
}
</style>
</head>
<body>
<div class="grid-container">
<header class="header">Header</header>
<nav class="nav">Navigation</nav>
<main class="main">Main Content</main>
<aside class="sidebar">Sidebar</aside>
<aside class="ad">Advertisement</aside>
<footer class="footer">Footer</footer>
</div>
</body>
</html>

Complex Grid Area Patterns

/* Magazine-style layout */
.magazine {
display: grid;
grid-template-areas: 
"header     header     header     header"
"featured   featured   featured   sidebar"
"article-1  article-1  article-2  sidebar"
"article-3  article-4  article-5  sidebar"
"footer     footer     footer     footer";
grid-template-columns: repeat(4, 1fr);
gap: 20px;
}
/* Dashboard layout */
.dashboard {
display: grid;
grid-template-areas: 
"header header header header"
"stats  stats  stats  stats"
"chart1 chart1 chart2 chart2"
"chart3 chart3 chart4 chart4"
"table  table  table  table"
"footer footer footer footer";
grid-template-columns: repeat(4, 1fr);
gap: 20px;
}
/* Holy grail layout */
.holy-grail {
display: grid;
grid-template-areas: 
"header header header"
"nav    main   aside"
"footer footer footer";
grid-template-columns: 200px 1fr 200px;
gap: 20px;
}
/* Asymmetric layout */
.asymmetric {
display: grid;
grid-template-areas: 
"hero    hero    hero    hero"
"content content sidebar sidebar"
"content content tweet   tweet"
"cards   cards   cards   cards";
grid-template-columns: repeat(4, 1fr);
gap: 20px;
}

Alignment and Spacing

Aligning Grid Items

/* Grid container alignment properties */
.container {
display: grid;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(3, 100px);
gap: 10px;
/* Align items within their cells (horizontal) */
justify-items: start;      /* start, end, center, stretch (default) */
/* Align items within their cells (vertical) */
align-items: center;       /* start, end, center, stretch */
/* Shorthand for both */
place-items: center stretch;
/* Align the entire grid within container (horizontal) */
justify-content: center;   /* start, end, center, stretch, space-around, space-between, space-evenly */
/* Align the entire grid within container (vertical) */
align-content: center;     /* same values as justify-content */
/* Shorthand for both */
place-content: center center;
}
/* Grid item alignment properties */
.item {
/* Override container's justify-items for this item */
justify-self: start;       /* start, end, center, stretch */
/* Override container's align-items for this item */
align-self: center;        /* start, end, center, stretch */
/* Shorthand for both */
place-self: center stretch;
}

Alignment Examples

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Grid Alignment Examples</title>
<style>
.grid-demo {
display: grid;
grid-template-columns: repeat(3, 150px);
grid-template-rows: repeat(3, 150px);
gap: 10px;
background: #f0f0f0;
padding: 20px;
width: 800px;
height: 600px;
}
.item {
background: #3498db;
color: white;
padding: 10px;
}
/* Different alignment examples */
.demo-1 {
justify-items: start;
align-items: start;
}
.demo-2 {
justify-items: center;
align-items: center;
}
.demo-3 {
justify-items: end;
align-items: end;
}
.demo-4 {
justify-items: stretch;
align-items: stretch;
}
.demo-5 {
justify-content: center;
align-content: center;
}
.demo-6 {
justify-content: space-between;
align-content: space-around;
}
/* Item-level overrides */
.special-item {
justify-self: center;
align-self: end;
background: #e74c3c;
}
</style>
</head>
<body>
<h2>Justify/Align Items: start</h2>
<div class="grid-demo demo-1">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
<h2>Justify/Align Items: center</h2>
<div class="grid-demo demo-2">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
<h2>Justify/Align Content: center</h2>
<div class="grid-demo demo-5">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
<h2>Item-level Override</h2>
<div class="grid-demo demo-1">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item special-item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
</body>
</html>

Gap and Spacing

/* Grid gap properties */
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
/* Individual gap properties */
row-gap: 20px;
column-gap: 30px;
/* Shorthand */
gap: 20px;           /* Same for rows and columns */
gap: 20px 30px;      /* row-gap column-gap */
}
/* Gap examples */
.gap-examples {
/* No gaps */
gap: 0;
/* Uniform gaps */
gap: 20px;
/* Different gaps */
gap: 10px 30px;
/* Gaps can be any unit */
gap: 1rem 2%;
/* Gaps with minmax */
gap: clamp(10px, 2vw, 30px);
}

Responsive Grid Design

Media Queries with Grid

/* Responsive grid with media queries */
.container {
display: grid;
gap: 20px;
/* Mobile first approach */
grid-template-columns: 1fr;  /* Single column on mobile */
}
/* Tablet */
@media (min-width: 768px) {
.container {
grid-template-columns: repeat(2, 1fr);  /* Two columns */
}
}
/* Desktop */
@media (min-width: 1024px) {
.container {
grid-template-columns: repeat(3, 1fr);  /* Three columns */
}
}
/* Large desktop */
@media (min-width: 1440px) {
.container {
grid-template-columns: repeat(4, 1fr);  /* Four columns */
}
}

Auto-Responsive Grids

/* Auto-responsive grid without media queries */
.auto-responsive {
display: grid;
gap: 20px;
/* Automatically adjusts columns based on container width */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}
/* With minimum width control */
.controlled-responsive {
display: grid;
gap: 20px;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
}
/* Responsive with max-width */
.responsive-container {
display: grid;
gap: 20px;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
max-width: 1200px;
margin: 0 auto;
}

Responsive Grid Areas

/* Responsive layout with grid areas */
.responsive-layout {
display: grid;
gap: 20px;
grid-template-areas: 
"header"
"nav"
"main"
"sidebar"
"footer";
}
@media (min-width: 768px) {
.responsive-layout {
grid-template-columns: 1fr 3fr;
grid-template-areas: 
"header header"
"nav    main"
"sidebar main"
"footer footer";
}
}
@media (min-width: 1024px) {
.responsive-layout {
grid-template-columns: 200px 1fr 200px;
grid-template-areas: 
"header header header"
"nav    main   sidebar"
"footer footer footer";
}
}

Complete Responsive Grid Example

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Responsive Grid Example</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', sans-serif;
padding: 20px;
background: #f5f5f5;
}
.responsive-grid {
display: grid;
gap: 20px;
max-width: 1400px;
margin: 0 auto;
}
/* Mobile: 1 column */
.responsive-grid {
grid-template-columns: 1fr;
}
/* Tablet: 2 columns */
@media (min-width: 600px) {
.responsive-grid {
grid-template-columns: repeat(2, 1fr);
}
}
/* Desktop: 4 columns */
@media (min-width: 900px) {
.responsive-grid {
grid-template-columns: repeat(4, 1fr);
}
}
/* Large desktop: 6 columns with featured items */
@media (min-width: 1200px) {
.responsive-grid {
grid-template-columns: repeat(6, 1fr);
}
.featured-card:first-child {
grid-column: span 2;
grid-row: span 2;
}
.featured-card:nth-child(2) {
grid-column: span 2;
}
.featured-card:nth-child(3),
.featured-card:nth-child(4) {
grid-column: span 1;
}
}
.card {
background: white;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
transition: transform 0.3s, box-shadow 0.3s;
}
.card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 20px rgba(0,0,0,0.15);
}
.card-image {
width: 100%;
height: 200px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 2rem;
}
.card-content {
padding: 20px;
}
.card-title {
font-size: 1.2rem;
margin-bottom: 10px;
color: #333;
}
.card-description {
color: #666;
line-height: 1.5;
margin-bottom: 15px;
}
.card-meta {
display: flex;
justify-content: space-between;
color: #999;
font-size: 0.9rem;
padding-top: 10px;
border-top: 1px solid #eee;
}
.featured-card .card-image {
height: 250px;
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
}
.featured-card .card-title {
font-size: 1.5rem;
}
</style>
</head>
<body>
<div class="responsive-grid">
<!-- Featured cards -->
<div class="card featured-card">
<div class="card-image">📸</div>
<div class="card-content">
<h3 class="card-title">Featured Project</h3>
<p class="card-description">This is our main featured project with detailed description and special styling.</p>
<div class="card-meta">
<span>👁️ 2.5k views</span>
<span>❤️ 1.2k likes</span>
</div>
</div>
</div>
<div class="card featured-card">
<div class="card-image">🎨</div>
<div class="card-content">
<h3 class="card-title">Design System</h3>
<p class="card-description">Complete design system with components and guidelines.</p>
<div class="card-meta">
<span>👁️ 1.8k views</span>
<span>❤️ 890 likes</span>
</div>
</div>
</div>
<!-- Regular cards -->
<div class="card">
<div class="card-image">💻</div>
<div class="card-content">
<h3 class="card-title">Web Development</h3>
<p class="card-description">Modern web development techniques and best practices.</p>
<div class="card-meta">
<span>👁️ 1.2k views</span>
<span>❤️ 450 likes</span>
</div>
</div>
</div>
<div class="card">
<div class="card-image">📱</div>
<div class="card-content">
<h3 class="card-title">Mobile Apps</h3>
<p class="card-description">Cross-platform mobile development with React Native.</p>
<div class="card-meta">
<span>👁️ 980 views</span>
<span>❤️ 320 likes</span>
</div>
</div>
</div>
<div class="card">
<div class="card-image">☁️</div>
<div class="card-content">
<h3 class="card-title">Cloud Computing</h3>
<p class="card-description">AWS, Azure, and Google Cloud platform tutorials.</p>
<div class="card-meta">
<span>👁️ 1.5k views</span>
<span>❤️ 670 likes</span>
</div>
</div>
</div>
<div class="card">
<div class="card-image">🤖</div>
<div class="card-content">
<h3 class="card-title">Machine Learning</h3>
<p class="card-description">Introduction to machine learning with Python.</p>
<div class="card-meta">
<span>👁️ 2.1k views</span>
<span>❤️ 1.1k likes</span>
</div>
</div>
</div>
<div class="card">
<div class="card-image">🔒</div>
<div class="card-content">
<h3 class="card-title">Cybersecurity</h3>
<p class="card-description">Essential security practices for developers.</p>
<div class="card-meta">
<span>👁️ 750 views</span>
<span>❤️ 280 likes</span>
</div>
</div>
</div>
<div class="card">
<div class="card-image">🚀</div>
<div class="card-content">
<h3 class="card-title">DevOps</h3>
<p class="card-description">CI/CD pipelines and infrastructure as code.</p>
<div class="card-meta">
<span>👁️ 890 views</span>
<span>❤️ 340 likes</span>
</div>
</div>
</div>
<div class="card">
<div class="card-image">🎮</div>
<div class="card-content">
<h3 class="card-title">Game Development</h3>
<p class="card-description">Create games with Unity and Unreal Engine.</p>
<div class="card-meta">
<span>👁️ 1.1k views</span>
<span>❤️ 560 likes</span>
</div>
</div>
</div>
<div class="card">
<div class="card-image">📊</div>
<div class="card-content">
<h3 class="card-title">Data Science</h3>
<p class="card-description">Data analysis and visualization techniques.</p>
<div class="card-meta">
<span>👁️ 670 views</span>
<span>❤️ 230 likes</span>
</div>
</div>
</div>
</div>
</body>
</html>

Advanced Grid Techniques

Nested Grids

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Nested Grids Example</title>
<style>
.outer-grid {
display: grid;
grid-template-columns: 1fr 2fr;
gap: 20px;
background: #f0f0f0;
padding: 20px;
}
.outer-item {
background: white;
padding: 20px;
border-radius: 8px;
}
.inner-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 15px;
}
.inner-item {
background: #3498db;
color: white;
padding: 15px;
border-radius: 5px;
text-align: center;
}
.complex-inner {
display: grid;
grid-template-areas: 
"header header"
"sidebar content"
"footer footer";
grid-template-columns: 100px 1fr;
gap: 10px;
background: #2ecc71;
padding: 10px;
border-radius: 5px;
}
.complex-header { grid-area: header; }
.complex-sidebar { grid-area: sidebar; }
.complex-content { grid-area: content; }
.complex-footer { grid-area: footer; }
.complex-item {
background: rgba(255,255,255,0.2);
color: white;
padding: 10px;
border-radius: 3px;
}
</style>
</head>
<body>
<div class="outer-grid">
<div class="outer-item">
<h3>Simple Nested Grid</h3>
<div class="inner-grid">
<div class="inner-item">Item 1</div>
<div class="inner-item">Item 2</div>
<div class="inner-item">Item 3</div>
<div class="inner-item">Item 4</div>
</div>
</div>
<div class="outer-item">
<h3>Complex Nested Grid</h3>
<div class="complex-inner">
<div class="complex-item complex-header">Header</div>
<div class="complex-item complex-sidebar">Sidebar</div>
<div class="complex-item complex-content">Content</div>
<div class="complex-item complex-footer">Footer</div>
</div>
</div>
</div>
</body>
</html>

Subgrid (Level 2 Feature)

/* Subgrid - currently supported in Firefox and Safari */
.parent-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20px;
}
.child-grid {
display: grid;
grid-column: span 2;
grid-template-columns: subgrid;  /* Inherit parent's columns */
gap: inherit;                     /* Inherit parent's gap */
}
/* Subgrid example */
.subgrid-example {
display: grid;
grid-template-columns: 200px 1fr 200px;
gap: 20px;
}
.nested-with-subgrid {
display: grid;
grid-column: 2 / 3;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
}

Masonry Layout with Grid

/* Masonry-like layout with grid */
.masonry {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
}
.masonry-item {
break-inside: avoid;
}
/* Grid with varying row heights */
.varying-heights {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
grid-auto-rows: minmax(100px, auto);
gap: 20px;
}
.varying-heights-item:nth-child(3n+1) {
grid-row: span 2;  /* Tall items */
}
.varying-heights-item:nth-child(3n+2) {
grid-row: span 3;  /* Even taller items */
}

Grid Ordering

/* Reordering grid items */
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
/* Order can be changed using grid placement */
.item-1 { grid-column: 3; }  /* Move to column 3 */
.item-2 { grid-column: 1; }  /* Move to column 1 */
.item-3 { grid-column: 2; }  /* Move to column 2 */
/* Order with media queries */
@media (max-width: 768px) {
.item-1 { grid-column: 1; }
.item-2 { grid-column: 2; }
.item-3 { grid-column: 3; }
}
/* Visual reordering example */
.reorder-demo {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
.reorder-demo .item:nth-child(1) { order: 3; }
.reorder-demo .item:nth-child(2) { order: 1; }
.reorder-demo .item:nth-child(3) { order: 2; }

Implicit vs Explicit Grid

/* Explicit grid - defined with template */
.explicit {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 100px 200px;
/* Only first 2 rows are explicitly defined */
}
/* Implicit grid - auto-generated rows/columns */
.implicit {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 150px;  /* Size of auto-generated rows */
grid-auto-columns: 200px; /* Size of auto-generated columns */
grid-auto-flow: row;     /* Auto-placement algorithm */
}
/* Grid auto-flow examples */
.auto-flow-row {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-flow: row;  /* Fill rows first (default) */
grid-auto-rows: 100px;
}
.auto-flow-column {
display: grid;
grid-template-rows: repeat(3, 100px);
grid-auto-flow: column;  /* Fill columns first */
grid-auto-columns: 200px;
}
.auto-flow-dense {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-flow: row dense;  /* Dense packing algorithm */
grid-auto-rows: 100px;
}

Grid vs Flexbox

When to Use Grid vs Flexbox

/* Grid: Two-dimensional layout */
.grid-2d {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, auto);
gap: 20px;
}
/* Flexbox: One-dimensional layout */
.flex-1d {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.flex-1d > * {
flex: 1 1 200px;  /* Items wrap when needed */
}

Comparison Examples

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Grid vs Flexbox</title>
<style>
.comparison {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 30px;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
/* Grid layout */
.grid-layout {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 15px;
background: #f0f0f0;
padding: 20px;
border-radius: 10px;
}
/* Flexbox layout */
.flex-layout {
display: flex;
flex-wrap: wrap;
gap: 15px;
background: #f0f0f0;
padding: 20px;
border-radius: 10px;
}
.flex-layout > * {
flex: 1 1 calc(33.333% - 15px);
min-width: 200px;
}
.item {
background: #3498db;
color: white;
padding: 20px;
text-align: center;
border-radius: 5px;
}
/* Complex grid layout */
.complex-grid {
display: grid;
grid-template-areas: 
"header header header"
"sidebar main main"
"footer footer footer";
grid-template-columns: 200px 1fr 1fr;
gap: 15px;
background: #f0f0f0;
padding: 20px;
border-radius: 10px;
}
/* Complex flexbox (less suitable) */
.complex-flex {
display: flex;
flex-wrap: wrap;
background: #f0f0f0;
padding: 20px;
border-radius: 10px;
}
.complex-flex > * {
margin: 7.5px;
}
.complex-flex .header {
flex: 0 0 calc(100% - 15px);
}
.complex-flex .sidebar {
flex: 0 0 200px;
}
.complex-flex .main {
flex: 1 1 calc(100% - 200px - 30px);
}
.complex-flex .footer {
flex: 0 0 calc(100% - 15px);
}
</style>
</head>
<body>
<h2>Grid vs Flexbox Comparison</h2>
<div class="comparison">
<div>
<h3>CSS Grid</h3>
<p>Best for 2D layouts (rows and columns)</p>
<div class="grid-layout">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
</div>
</div>
<div>
<h3>Flexbox</h3>
<p>Best for 1D layouts (rows OR columns)</p>
<div class="flex-layout">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
</div>
</div>
</div>
<h2>Complex Layout Comparison</h2>
<div class="comparison">
<div>
<h3>Grid - Natural</h3>
<div class="complex-grid">
<div class="item" style="grid-area: header;">Header</div>
<div class="item" style="grid-area: sidebar;">Sidebar</div>
<div class="item" style="grid-area: main;">Main Content</div>
<div class="item" style="grid-area: footer;">Footer</div>
</div>
</div>
<div>
<h3>Flexbox - Forced</h3>
<div class="complex-flex">
<div class="item header">Header</div>
<div class="item sidebar">Sidebar</div>
<div class="item main">Main Content</div>
<div class="item footer">Footer</div>
</div>
</div>
</div>
</body>
</html>

Decision Guide

/* Use Grid when: */
.grid-usage {
/* 1. You need both row and column control */
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, auto);
/* 2. You have complex alignments */
justify-items: center;
align-items: center;
/* 3. You need gaps between items */
gap: 20px;
/* 4. You want to overlap items */
position: relative;
}
/* Use Flexbox when: */
.flex-usage {
/* 1. You need a one-dimensional layout */
display: flex;
/* 2. You want content to dictate size */
flex: 1 1 auto;
/* 3. You need dynamic reordering */
order: 1;
/* 4. You want items to wrap */
flex-wrap: wrap;
}

Browser Support and Fallbacks

Feature Detection with @supports

/* Modern browsers with Grid support */
@supports (display: grid) {
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
}
/* Fallback for older browsers */
@supports not (display: grid) {
.container {
display: flex;
flex-wrap: wrap;
}
.container > * {
width: calc(33.333% - 20px);
margin: 10px;
}
}

Complete Fallback Example

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Grid with Fallbacks</title>
<style>
/* Base styles (for all browsers) */
.grid-fallback {
display: flex;
flex-wrap: wrap;
margin: -10px;
}
.grid-fallback > * {
width: calc(33.333% - 20px);
margin: 10px;
background: #3498db;
color: white;
padding: 20px;
box-sizing: border-box;
}
/* Grid for modern browsers */
@supports (display: grid) {
.grid-fallback {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
margin: 0;
}
.grid-fallback > * {
width: auto;
margin: 0;
}
/* Advanced grid features */
.grid-fallback.featured {
grid-template-columns: 2fr 1fr 1fr;
}
.grid-fallback .wide {
grid-column: span 2;
}
}
</style>
</head>
<body>
<div class="grid-fallback featured">
<div class="wide">Wide Item</div>
<div>Item 2</div>
<div>Item 3</div>
<div>Item 4</div>
<div>Item 5</div>
<div>Item 6</div>
</div>
</body>
</html>

Browser Support Table

/* Browser support for CSS Grid */
/* 
Chrome: 57+ (2017)
Firefox: 52+ (2017)
Safari: 10.1+ (2017)
Edge: 16+ (2017)
IE: No support (use -ms- prefix for older Edge)
*/
/* IE/Edge legacy syntax */
.grid-ie {
display: -ms-grid;
-ms-grid-columns: 1fr 20px 1fr 20px 1fr;
-ms-grid-rows: auto 20px auto;
}
.item-ie {
-ms-grid-column: 1;
-ms-grid-row: 1;
}

Practical Examples

Example 1: Magazine Layout

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Magazine Layout</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Georgia', serif;
background: #f5f5f5;
padding: 20px;
}
.magazine {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20px;
max-width: 1400px;
margin: 0 auto;
}
.header {
grid-column: 1 / -1;
text-align: center;
padding: 40px;
background: white;
border-bottom: 3px solid #333;
margin-bottom: 20px;
}
.header h1 {
font-size: 3rem;
letter-spacing: 2px;
}
.featured-article {
grid-column: span 2;
grid-row: span 2;
background: white;
padding: 20px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.featured-article img {
width: 100%;
height: 300px;
object-fit: cover;
margin-bottom: 15px;
}
.featured-article h2 {
font-size: 2rem;
margin-bottom: 10px;
}
.featured-article .meta {
color: #666;
margin-bottom: 15px;
font-style: italic;
}
.article-card {
background: white;
padding: 20px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
.article-card.small {
grid-column: span 1;
}
.article-card.medium {
grid-column: span 2;
}
.article-card img {
width: 100%;
height: 150px;
object-fit: cover;
margin-bottom: 10px;
}
.article-card h3 {
font-size: 1.3rem;
margin-bottom: 8px;
}
.sidebar {
grid-column: span 1;
grid-row: span 3;
background: #f0f0f0;
padding: 20px;
}
.sidebar h3 {
border-bottom: 2px solid #333;
padding-bottom: 10px;
margin-bottom: 15px;
}
.sidebar ul {
list-style: none;
}
.sidebar li {
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid #ddd;
}
.sidebar a {
color: #333;
text-decoration: none;
}
.sidebar a:hover {
color: #666;
}
.advertisement {
grid-column: span 1;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 20px;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
}
.footer {
grid-column: 1 / -1;
text-align: center;
padding: 30px;
background: #333;
color: white;
margin-top: 20px;
}
@media (max-width: 900px) {
.magazine {
grid-template-columns: repeat(2, 1fr);
}
.featured-article {
grid-column: span 2;
}
.sidebar {
grid-column: span 2;
grid-row: auto;
}
}
@media (max-width: 600px) {
.magazine {
grid-template-columns: 1fr;
}
.featured-article,
.article-card,
.sidebar,
.advertisement {
grid-column: 1 !important;
}
}
</style>
</head>
<body>
<div class="magazine">
<header class="header">
<h1>The Daily Chronicle</h1>
<p>Your source for news and insights</p>
</header>
<article class="featured-article">
<img src="https://via.placeholder.com/800x400" alt="Featured">
<h2>Breaking News: Major Discovery in Science</h2>
<div class="meta">By Jane Smith | 2 hours ago</div>
<p>Scientists have made a groundbreaking discovery that could change our understanding of the universe. This remarkable finding opens up new possibilities for research and development across multiple fields...</p>
</article>
<article class="article-card">
<img src="https://via.placeholder.com/300x150" alt="Article">
<h3>Technology Trends 2024</h3>
<p>The latest innovations shaping our digital future...</p>
</article>
<article class="article-card">
<img src="https://via.placeholder.com/300x150" alt="Article">
<h3>Health & Wellness</h3>
<p>New studies reveal surprising benefits of meditation...</p>
</article>
<aside class="sidebar">
<h3>Popular Articles</h3>
<ul>
<li><a href="#">Understanding Climate Change</a></li>
<li><a href="#">Guide to Remote Work</a></li>
<li><a href="#">Investment Strategies</a></li>
<li><a href="#">Travel Destinations 2024</a></li>
<li><a href="#">Recipe of the Week</a></li>
</ul>
<h3 style="margin-top: 30px;">Categories</h3>
<ul>
<li><a href="#">Technology</a></li>
<li><a href="#">Science</a></li>
<li><a href="#">Health</a></li>
<li><a href="#">Business</a></li>
<li><a href="#">Entertainment</a></li>
</ul>
</aside>
<article class="article-card">
<img src="https://via.placeholder.com/300x150" alt="Article">
<h3>Space Exploration</h3>
<p>New missions planned for Mars colonization...</p>
</article>
<div class="advertisement">
<div>
<h3>Advertisement</h3>
<p>Your ad could be here!</p>
</div>
</div>
<article class="article-card medium">
<img src="https://via.placeholder.com/600x200" alt="Article">
<h3>Economic Outlook</h3>
<p>Experts predict steady growth for the coming year with new opportunities in emerging markets...</p>
</article>
<article class="article-card">
<img src="https://via.placeholder.com/300x150" alt="Article">
<h3>Sports Update</h3>
<p>Local team advances to championship...</p>
</article>
<footer class="footer">
<p>&copy; 2024 The Daily Chronicle. All rights reserved.</p>
</footer>
</div>
</body>
</html>

Example 2: Dashboard Layout

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dashboard Layout</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: #1a1a2e;
color: white;
}
.dashboard {
display: grid;
grid-template-columns: 250px 1fr 1fr 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas: 
"sidebar header header header"
"sidebar stats charts activity"
"sidebar recent recent recent";
min-height: 100vh;
gap: 20px;
padding: 20px;
}
.sidebar {
grid-area: sidebar;
background: #16213e;
padding: 20px;
border-radius: 10px;
}
.logo {
font-size: 1.5rem;
font-weight: bold;
padding: 20px 0;
border-bottom: 1px solid #0f3460;
margin-bottom: 30px;
}
.nav-item {
padding: 12px 15px;
margin: 5px 0;
border-radius: 8px;
cursor: pointer;
transition: background 0.3s;
}
.nav-item:hover {
background: #0f3460;
}
.nav-item.active {
background: #0f3460;
border-left: 3px solid #e94560;
}
.header {
grid-area: header;
background: #16213e;
padding: 20px;
border-radius: 10px;
display: flex;
justify-content: space-between;
align-items: center;
}
.search-bar {
display: flex;
align-items: center;
background: #0f3460;
padding: 8px 15px;
border-radius: 20px;
width: 300px;
}
.search-bar input {
background: transparent;
border: none;
color: white;
margin-left: 10px;
width: 100%;
outline: none;
}
.user-profile {
display: flex;
align-items: center;
gap: 15px;
}
.avatar {
width: 40px;
height: 40px;
background: #e94560;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
}
.stats {
grid-area: stats;
display: grid;
grid-template-columns: 1fr;
gap: 15px;
}
.stat-card {
background: #16213e;
padding: 20px;
border-radius: 10px;
display: flex;
flex-direction: column;
}
.stat-title {
color: #888;
font-size: 0.9rem;
margin-bottom: 10px;
}
.stat-value {
font-size: 2rem;
font-weight: bold;
margin-bottom: 5px;
}
.stat-change {
color: #4caf50;
font-size: 0.9rem;
}
.charts {
grid-area: charts;
background: #16213e;
padding: 20px;
border-radius: 10px;
}
.chart-placeholder {
height: 200px;
background: #0f3460;
border-radius: 8px;
margin-top: 15px;
display: flex;
align-items: flex-end;
padding: 10px;
}
.bar {
flex: 1;
background: linear-gradient(to top, #e94560, #ff6b6b);
margin: 0 5px;
border-radius: 5px 5px 0 0;
transition: height 0.3s;
}
.activity {
grid-area: activity;
background: #16213e;
padding: 20px;
border-radius: 10px;
}
.activity-item {
display: flex;
align-items: center;
gap: 15px;
padding: 12px 0;
border-bottom: 1px solid #0f3460;
}
.activity-icon {
width: 35px;
height: 35px;
background: #0f3460;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.activity-content {
flex: 1;
}
.activity-time {
color: #888;
font-size: 0.8rem;
}
.recent {
grid-area: recent;
background: #16213e;
padding: 20px;
border-radius: 10px;
}
.recent-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.recent-table {
width: 100%;
}
.recent-table th {
text-align: left;
padding: 10px;
color: #888;
font-weight: normal;
border-bottom: 1px solid #0f3460;
}
.recent-table td {
padding: 10px;
border-bottom: 1px solid #0f3460;
}
.badge {
background: #0f3460;
padding: 3px 8px;
border-radius: 12px;
font-size: 0.8rem;
}
.badge.success { background: #4caf50; }
.badge.warning { background: #ff9800; }
.badge.danger { background: #e94560; }
@media (max-width: 1024px) {
.dashboard {
grid-template-areas: 
"sidebar header header"
"sidebar stats stats"
"sidebar charts activity"
"sidebar recent recent";
grid-template-columns: 200px 1fr 1fr;
}
}
@media (max-width: 768px) {
.dashboard {
grid-template-areas: 
"header"
"stats"
"charts"
"activity"
"recent"
"sidebar";
grid-template-columns: 1fr;
}
.sidebar {
display: none; /* Would need mobile menu */
}
}
</style>
</head>
<body>
<div class="dashboard">
<aside class="sidebar">
<div class="logo">📊 Dashboard</div>
<nav>
<div class="nav-item active">🏠 Overview</div>
<div class="nav-item">📈 Analytics</div>
<div class="nav-item">👥 Users</div>
<div class="nav-item">📦 Products</div>
<div class="nav-item">💰 Sales</div>
<div class="nav-item">⚙️ Settings</div>
</nav>
</aside>
<header class="header">
<div class="search-bar">
<span>🔍</span>
<input type="text" placeholder="Search...">
</div>
<div class="user-profile">
<span>🔔</span>
<span>📧</span>
<div class="avatar">JD</div>
</div>
</header>
<div class="stats">
<div class="stat-card">
<div class="stat-title">Total Revenue</div>
<div class="stat-value">$124,563</div>
<div class="stat-change">↑ 12.5% from last month</div>
</div>
<div class="stat-card">
<div class="stat-title">Active Users</div>
<div class="stat-value">2,345</div>
<div class="stat-change">↑ 8.2% from last month</div>
</div>
<div class="stat-card">
<div class="stat-title">New Orders</div>
<div class="stat-value">567</div>
<div class="stat-change">↓ 3.1% from last month</div>
</div>
</div>
<div class="charts">
<h3>Revenue Overview</h3>
<div class="chart-placeholder">
<div class="bar" style="height: 60%;"></div>
<div class="bar" style="height: 75%;"></div>
<div class="bar" style="height: 55%;"></div>
<div class="bar" style="height: 80%;"></div>
<div class="bar" style="height: 70%;"></div>
<div class="bar" style="height: 90%;"></div>
<div class="bar" style="height: 65%;"></div>
</div>
</div>
<div class="activity">
<h3>Recent Activity</h3>
<div class="activity-item">
<div class="activity-icon">👤</div>
<div class="activity-content">
<div>New user registered</div>
<div class="activity-time">5 minutes ago</div>
</div>
</div>
<div class="activity-item">
<div class="activity-icon">💰</div>
<div class="activity-content">
<div>New order #12345</div>
<div class="activity-time">15 minutes ago</div>
</div>
</div>
<div class="activity-item">
<div class="activity-icon">⭐</div>
<div class="activity-content">
<div>New review received</div>
<div class="activity-time">32 minutes ago</div>
</div>
</div>
<div class="activity-item">
<div class="activity-icon">📧</div>
<div class="activity-content">
<div>Support ticket opened</div>
<div class="activity-time">1 hour ago</div>
</div>
</div>
</div>
<div class="recent">
<div class="recent-header">
<h3>Recent Orders</h3>
<a href="#" style="color: #e94560;">View All →</a>
</div>
<table class="recent-table">
<thead>
<tr>
<th>Order ID</th>
<th>Customer</th>
<th>Product</th>
<th>Status</th>
<th>Amount</th>
</tr>
</thead>
<tbody>
<tr>
<td>#12345</td>
<td>John Doe</td>
<td>Product A</td>
<td><span class="badge success">Completed</span></td>
<td>$129.99</td>
</tr>
<tr>
<td>#12346</td>
<td>Jane Smith</td>
<td>Product B</td>
<td><span class="badge warning">Pending</span></td>
<td>$89.99</td>
</tr>
<tr>
<td>#12347</td>
<td>Bob Johnson</td>
<td>Product C</td>
<td><span class="badge danger">Cancelled</span></td>
<td>$199.99</td>
</tr>
<tr>
<td>#12348</td>
<td>Alice Brown</td>
<td>Product A</td>
<td><span class="badge success">Completed</span></td>
<td>$129.99</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>

Example 3: Product Grid

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Product Grid</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: #f5f5f5;
padding: 20px;
}
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 25px;
max-width: 1400px;
margin: 0 auto;
}
.product-card {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 3px 10px rgba(0,0,0,0.1);
transition: transform 0.3s, box-shadow 0.3s;
display: grid;
grid-template-rows: 200px 1fr auto;
}
.product-card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 20px rgba(0,0,0,0.15);
}
.product-image {
width: 100%;
height: 200px;
object-fit: cover;
}
.product-info {
padding: 20px;
}
.product-title {
font-size: 1.2rem;
margin-bottom: 10px;
color: #333;
}
.product-description {
color: #666;
line-height: 1.5;
margin-bottom: 15px;
font-size: 0.95rem;
}
.product-meta {
display: grid;
grid-template-columns: 1fr auto;
align-items: center;
padding: 15px 20px;
background: #f9f9f9;
border-top: 1px solid #eee;
}
.product-price {
font-size: 1.3rem;
font-weight: bold;
color: #2c3e50;
}
.product-rating {
color: #f39c12;
}
.product-actions {
padding: 15px 20px;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
}
.btn {
padding: 10px;
border: none;
border-radius: 6px;
cursor: pointer;
font-weight: 600;
transition: background 0.3s;
}
.btn-primary {
background: #3498db;
color: white;
}
.btn-primary:hover {
background: #2980b9;
}
.btn-secondary {
background: #ecf0f1;
color: #34495e;
}
.btn-secondary:hover {
background: #bdc3c7;
}
.badge {
position: absolute;
top: 10px;
left: 10px;
background: #e74c3c;
color: white;
padding: 5px 10px;
border-radius: 20px;
font-size: 0.8rem;
font-weight: bold;
}
.product-card {
position: relative;
}
/* Featured product styles */
.product-card.featured {
grid-column: span 2;
grid-row: span 2;
display: grid;
grid-template-rows: 300px 1fr auto;
}
.product-card.featured .product-image {
height: 300px;
}
.product-card.featured .product-title {
font-size: 1.5rem;
}
/* Responsive adjustments */
@media (max-width: 768px) {
.product-grid {
gap: 15px;
}
.product-card.featured {
grid-column: span 1;
grid-row: span 1;
grid-template-rows: 200px 1fr auto;
}
.product-card.featured .product-image {
height: 200px;
}
}
</style>
</head>
<body>
<div class="product-grid">
<!-- Featured Product -->
<div class="product-card featured">
<span class="badge">Featured</span>
<img src="https://via.placeholder.com/600x400" alt="Product" class="product-image">
<div class="product-info">
<h3 class="product-title">Premium Wireless Headphones</h3>
<p class="product-description">Experience crystal-clear sound with our premium wireless headphones. Features active noise cancellation, 30-hour battery life, and comfortable ergonomic design.</p>
</div>
<div class="product-meta">
<span class="product-price">$299.99</span>
<span class="product-rating">★★★★★ (245)</span>
</div>
<div class="product-actions">
<button class="btn btn-primary">Add to Cart</button>
<button class="btn btn-secondary">Quick View</button>
</div>
</div>
<!-- Regular Products -->
<div class="product-card">
<img src="https://via.placeholder.com/400x300" alt="Product" class="product-image">
<div class="product-info">
<h3 class="product-title">Smart Watch</h3>
<p class="product-description">Track your fitness, receive notifications, and more with this sleek smartwatch.</p>
</div>
<div class="product-meta">
<span class="product-price">$199.99</span>
<span class="product-rating">★★★★☆ (156)</span>
</div>
<div class="product-actions">
<button class="btn btn-primary">Add to Cart</button>
<button class="btn btn-secondary">Quick View</button>
</div>
</div>
<div class="product-card">
<span class="badge" style="background: #f39c12;">Sale</span>
<img src="https://via.placeholder.com/400x300" alt="Product" class="product-image">
<div class="product-info">
<h3 class="product-title">Bluetooth Speaker</h3>
<p class="product-description">Portable waterproof speaker with amazing sound quality and 20-hour battery life.</p>
</div>
<div class="product-meta">
<span class="product-price" style="color: #e74c3c;">$79.99</span>
<span class="product-rating">★★★★☆ (89)</span>
</div>
<div class="product-actions">
<button class="btn btn-primary">Add to Cart</button>
<button class="btn btn-secondary">Quick View</button>
</div>
</div>
<div class="product-card">
<img src="https://via.placeholder.com/400x300" alt="Product" class="product-image">
<div class="product-info">
<h3 class="product-title">Tablet Pro</h3>
<p class="product-description">10.5-inch display, 128GB storage, perfect for work and entertainment.</p>
</div>
<div class="product-meta">
<span class="product-price">$449.99</span>
<span class="product-rating">★★★★☆ (312)</span>
</div>
<div class="product-actions">
<button class="btn btn-primary">Add to Cart</button>
<button class="btn btn-secondary">Quick View</button>
</div>
</div>
<div class="product-card">
<img src="https://via.placeholder.com/400x300" alt="Product" class="product-image">
<div class="product-info">
<h3 class="product-title">Gaming Mouse</h3>
<p class="product-description">RGB gaming mouse with programmable buttons and precise optical sensor.</p>
</div>
<div class="product-meta">
<span class="product-price">$59.99</span>
<span class="product-rating">★★★☆☆ (42)</span>
</div>
<div class="product-actions">
<button class="btn btn-primary">Add to Cart</button>
<button class="btn btn-secondary">Quick View</button>
</div>
</div>
<div class="product-card">
<img src="https://via.placeholder.com/400x300" alt="Product" class="product-image">
<div class="product-info">
<h3 class="product-title">Mechanical Keyboard</h3>
<p class="product-description">Tactile mechanical switches with RGB backlighting and wrist rest.</p>
</div>
<div class="product-meta">
<span class="product-price">$129.99</span>
<span class="product-rating">★★★★★ (178)</span>
</div>
<div class="product-actions">
<button class="btn btn-primary">Add to Cart</button>
<button class="btn btn-secondary">Quick View</button>
</div>
</div>
<div class="product-card">
<img src="https://via.placeholder.com/400x300" alt="Product" class="product-image">
<div class="product-info">
<h3 class="product-title">USB-C Hub</h3>
<p class="product-description">7-in-1 USB-C hub with HDMI, USB ports, and card reader.</p>
</div>
<div class="product-meta">
<span class="product-price">$49.99</span>
<span class="product-rating">★★★★☆ (67)</span>
</div>
<div class="product-actions">
<button class="btn btn-primary">Add to Cart</button>
<button class="btn btn-secondary">Quick View</button>
</div>
</div>
<div class="product-card">
<img src="https://via.placeholder.com/400x300" alt="Product" class="product-image">
<div class="product-info">
<h3 class="product-title">External SSD</h3>
<p class="product-description">500GB portable SSD with USB 3.2 Gen 2 for lightning-fast transfers.</p>
</div>
<div class="product-meta">
<span class="product-price">$89.99</span>
<span class="product-rating">★★★★☆ (94)</span>
</div>
<div class="product-actions">
<button class="btn btn-primary">Add to Cart</button>
<button class="btn btn-secondary">Quick View</button>
</div>
</div>
</div>
</body>
</html>

Best Practices

Grid Architecture Best Practices

/* 1. Use meaningful grid area names */
.container {
display: grid;
grid-template-areas: 
"header header"
"sidebar main"
"footer footer";
}
/* 2. Keep it simple - don't overcomplicate */
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
/* Simple, responsive, maintainable */
}
/* 3. Use fractions (fr) over percentages */
.container {
grid-template-columns: 1fr 2fr 1fr;  /* Good */
grid-template-columns: 25% 50% 25%;   /* May cause issues with gaps */
}
/* 4. Plan for responsiveness */
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
/* 5. Use gap for consistent spacing */
.container {
gap: 20px;  /* Consistent spacing */
}
/* 6. Avoid over-specificity */
/* Bad */
body .main .content .grid .item { }
/* Good */
.grid .item { }
/* 7. Document complex layouts */
/**
* Dashboard layout
* Header: full width
* Sidebar: 250px fixed
* Main: flexible content
* Footer: full width
*/
.dashboard {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-areas: 
"header header"
"sidebar main"
"footer footer";
}

Performance Considerations

/* 1. Limit grid complexity */
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);  /* 4 tracks */
/* Avoid dozens of tracks */
}
/* 2. Use minmax for responsive designs */
.container {
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
/* 3. Avoid grid reflow in animations */
.animate {
will-change: transform;  /* Better performance */
transform: translateZ(0);
}
/* 4. Use contain for isolation */
.isolated {
contain: layout;  /* Creates new formatting context */
}

Grid Checklist

/* Grid implementation checklist */
.container {
/* ✅ Define grid container */
display: grid;
/* ✅ Set up columns */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
/* ✅ Add consistent gaps */
gap: 20px;
/* ✅ Consider responsive behavior */
/* Already handled by auto-fit */
/* ✅ Test on different screen sizes */
/* Use media queries if needed */
/* ✅ Add fallbacks if needed */
@supports not (display: grid) {
/* Fallback styles */
}
}

Conclusion

CSS Grid Layout is a powerful tool for creating complex, responsive layouts:

Key Takeaways

  1. Two-dimensional control: Grid handles both rows and columns simultaneously
  2. Simple syntax: Create complex layouts with minimal code
  3. Responsive by design: Auto-fit, minmax, and repeat make grids naturally responsive
  4. Alignment control: Fine-tune item placement with alignment properties
  5. Grid areas: Name and place items intuitively
  6. No layout hacks: Eliminate need for floats, clearfix, and complex calculations

When to Use Grid

✅ Full page layouts
✅ Dashboard designs
✅ Card grids
✅ Magazine layouts
✅ Complex forms
✅ Image galleries

When to Use Other Tools

❌ Simple navigation bars → Flexbox
❌ One-dimensional lists → Flexbox
❌ Text content → Normal flow
❌ Small components → Flexbox or normal flow

Next Steps

  1. Practice creating different grid layouts
  2. Combine Grid with Flexbox for optimal results
  3. Experiment with nested grids
  4. Test on different browsers and devices
  5. Explore subgrid for advanced patterns

CSS Grid has revolutionized web layout design. Master it, and you'll be able to create virtually any layout you can imagine!

Leave a Reply

Your email address will not be published. Required fields are marked *


Macro Nepal Helper