Master CSS Grid named areas for semantic, maintainable layouts. Learn to create readable grid structures using grid-template-areas and grid-area properties.
CSS Grid Template Areas provide a powerful way to create layouts using named regions instead of line numbers. This approach makes your code more semantic, maintainable, and easier to understand at a glance.
Named grid areas let you visualize your layout directly in the CSS, making it instantly clear how your design is structured. This is particularly valuable for complex layouts and when working in teams.
In this lesson, you'll master this professional technique used by developers to create clean, maintainable grid layouts that are easy to modify and extend.
Use grid-template-areas to define named regions in your grid layout.
Basic Template Areas:
1.layout {
2 display: grid;
3 grid-template-areas:
4 "header header header"
5 "sidebar main main"
6 "footer footer footer";
7 grid-template-columns: 200px 1fr 1fr;
8 grid-template-rows: 60px 1fr 40px;
9}Assigning Items to Areas:
1.header { grid-area: header; }
2.sidebar { grid-area: sidebar; }
3.main { grid-area: main; }
4.footer { grid-area: footer; }Benefits:
Create complex layouts with sophisticated area arrangements.
Magazine Layout:
1.magazine {
2 display: grid;
3 grid-template-areas:
4 "masthead masthead masthead"
5 "feature feature sidebar"
6 "article1 article2 sidebar"
7 "footer footer footer";
8 grid-template-columns: 1fr 1fr 300px;
9 gap: 20px;
10}Dashboard Layout:
1.dashboard {
2 display: grid;
3 grid-template-areas:
4 "nav header header header"
5 "nav main main aside"
6 "nav main main aside"
7 "nav footer footer footer";
8 grid-template-columns: 250px 1fr 1fr 200px;
9}Empty Cells:
1.sparse-layout {
2 grid-template-areas:
3 "logo . . search"
4 "nav nav nav nav"
5 "main main . sidebar";
6}The period (.) represents empty grid cells.
Adapt grid template areas for different screen sizes.
Desktop Layout:
1.responsive-layout {
2 display: grid;
3 grid-template-areas:
4 "header header header"
5 "nav main sidebar"
6 "footer footer footer";
7 grid-template-columns: 200px 1fr 250px;
8}Tablet Layout:
1@media (max-width: 768px) {
2 .responsive-layout {
3 grid-template-areas:
4 "header header"
5 "nav main"
6 "sidebar sidebar"
7 "footer footer";
8 grid-template-columns: 150px 1fr;
9 }
10}Mobile Layout:
1@media (max-width: 480px) {
2 .responsive-layout {
3 grid-template-areas:
4 "header"
5 "nav"
6 "main"
7 "sidebar"
8 "footer";
9 grid-template-columns: 1fr;
10 }
11}This approach provides clean, semantic responsive design.
Build responsive layouts using grid template areas. See how named areas make complex layouts semantic and maintainable.
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>Grid Template Areas & Naming</title>
7 <style>
8 * {
9 margin: 0;
10 padding: 0;
11 box-sizing: border-box;
12 }
13
14 body {
15 font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
16 background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
17 color: #333;
18 padding: 20px;
19 }
20
21 .demo-container {
22 max-width: 1200px;
23 margin: 0 auto;
24 background: white;
25 border-radius: 16px;
26 padding: 30px;
27 box-shadow: 0 20px 60px rgba(0,0,0,0.1);
28 }
29
30 h1 {
31 text-align: center;
32 color: #2d3748;
33 margin-bottom: 30px;
34 font-size: 2.5rem;
35 }
36
37 .layout-controls {
38 display: flex;
39 gap: 15px;
40 margin-bottom: 30px;
41 flex-wrap: wrap;
42 justify-content: center;
43 }
44
45 .layout-btn {
46 padding: 12px 24px;
47 border: none;
48 border-radius: 8px;
49 background: #4299e1;
50 color: white;
51 font-weight: 600;
52 cursor: pointer;
53 transition: all 0.3s ease;
54 font-size: 14px;
55 }
56
57 .layout-btn:hover {
58 background: #3182ce;
59 transform: translateY(-2px);
60 }
61
62 .layout-btn.active {
63 background: #2b6cb0;
64 box-shadow: 0 4px 12px rgba(43, 108, 176, 0.4);
65 }
66
67 /* Default Desktop Layout */
68 .responsive-layout {
69 display: grid;
70 grid-template-areas:
71 "header header header header"
72 "nav main main sidebar"
73 "nav main main sidebar"
74 "footer footer footer footer";
75 grid-template-columns: 200px 1fr 1fr 250px;
76 grid-template-rows: 80px 1fr 1fr 60px;
77 gap: 20px;
78 height: 600px;
79 background: #f8fafc;
80 padding: 20px;
81 border-radius: 12px;
82 border: 3px solid #e2e8f0;
83 margin-bottom: 30px;
84 }
85
86 /* Grid Items */
87 .grid-area {
88 border-radius: 8px;
89 padding: 20px;
90 color: white;
91 font-weight: 600;
92 display: flex;
93 flex-direction: column;
94 justify-content: center;
95 align-items: center;
96 text-align: center;
97 box-shadow: 0 4px 12px rgba(0,0,0,0.1);
98 transition: transform 0.3s ease, box-shadow 0.3s ease;
99 }
100
101 .grid-area:hover {
102 transform: scale(1.02);
103 box-shadow: 0 8px 20px rgba(0,0,0,0.15);
104 }
105
106 .header {
107 grid-area: header;
108 background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
109 }
110
111 .nav {
112 grid-area: nav;
113 background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
114 }
115
116 .main {
117 grid-area: main;
118 background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
119 }
120
121 .sidebar {
122 grid-area: sidebar;
123 background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
124 }
125
126 .footer {
127 grid-area: footer;
128 background: linear-gradient(135deg, #fa709a 0%, #fee140 100%);
129 }
130
131 /* Responsive Layouts */
132 .tablet-layout {
133 grid-template-areas:
134 "header header header"
135 "nav main sidebar"
136 "nav main sidebar"
137 "footer footer footer";
138 grid-template-columns: 180px 1fr 200px;
139 grid-template-rows: 80px 1fr 1fr 60px;
140 }
141
142 .mobile-layout {
143 grid-template-areas:
144 "header"
145 "nav"
146 "main"
147 "sidebar"
148 "footer";
149 grid-template-columns: 1fr;
150 grid-template-rows: 80px 100px 1fr 120px 60px;
151 }
152
153 .magazine-layout {
154 grid-template-areas:
155 "masthead masthead masthead"
156 "featured featured sidebar"
157 "article1 article2 sidebar"
158 "footer footer footer";
159 grid-template-columns: 1fr 1fr 300px;
160 grid-template-rows: 100px 200px 1fr 80px;
161 }
162
163 .dashboard-layout {
164 grid-template-areas:
165 "sidebar header header toolbar"
166 "sidebar main main toolbar"
167 "sidebar main main toolbar"
168 "sidebar footer footer footer";
169 grid-template-columns: 220px 1fr 1fr 180px;
170 grid-template-rows: 70px 1fr 1fr 50px;
171 }
172
173 /* Code Display */
174 .code-display {
175 background: #2d3748;
176 color: #a0aec0;
177 padding: 25px;
178 border-radius: 12px;
179 font-family: 'Fira Code', 'Monaco', monospace;
180 font-size: 14px;
181 line-height: 1.6;
182 overflow-x: auto;
183 box-shadow: inset 0 2px 4px rgba(0,0,0,0.1);
184 }
185
186 .highlight {
187 color: #68d391;
188 font-weight: bold;
189 }
190
191 .comment {
192 color: #718096;
193 font-style: italic;
194 }
195
196 .property {
197 color: #63b3ed;
198 }
199
200 .value {
201 color: #fbd38d;
202 }
203 </style>
204</head>
205<body>
206 <div class="demo-container">
207 <h1>🏗️ Grid Template Areas & Naming</h1>
208
209 <div class="layout-controls">
210 <button class="layout-btn active" onclick="setLayout('desktop')">🖥️ Desktop</button>
211 <button class="layout-btn" onclick="setLayout('tablet')">📱 Tablet</button>
212 <button class="layout-btn" onclick="setLayout('mobile')">📱 Mobile</button>
213 <button class="layout-btn" onclick="setLayout('magazine')">📰 Magazine</button>
214 <button class="layout-btn" onclick="setLayout('dashboard')">📊 Dashboard</button>
215 </div>
216
217 <div class="responsive-layout" id="layout">
218 <div class="grid-area header">
219 <h2>📋 Header</h2>
220 <p>Site branding & navigation</p>
221 </div>
222 <div class="grid-area nav">
223 <h3>🧭 Navigation</h3>
224 <p>Main menu & links</p>
225 </div>
226 <div class="grid-area main">
227 <h3>📄 Main Content</h3>
228 <p>Primary content area with articles and posts</p>
229 </div>
230 <div class="grid-area sidebar">
231 <h3>📌 Sidebar</h3>
232 <p>Widgets & secondary content</p>
233 </div>
234 <div class="grid-area footer">
235 <h3>🔗 Footer</h3>
236 <p>Copyright & links</p>
237 </div>
238 </div>
239
240 <div class="code-display" id="codeDisplay">
241<span class="comment">/* Desktop Layout with Named Areas */</span>
242<span class="property">.responsive-layout</span> {
243 <span class="property">display</span>: <span class="value">grid</span>;
244 <span class="property">grid-template-areas</span>:
245 <span class="value">"header header header header"
246 "nav main main sidebar"
247 "nav main main sidebar"
248 "footer footer footer footer"</span>;
249 <span class="property">grid-template-columns</span>: <span class="value">200px 1fr 1fr 250px</span>;
250 <span class="property">grid-template-rows</span>: <span class="value">80px 1fr 1fr 60px</span>;
251 <span class="property">gap</span>: <span class="value">20px</span>;
252}
253
254<span class="comment">/* Assign items to named areas */</span>
255<span class="property">.header</span> { <span class="property">grid-area</span>: <span class="highlight">header</span>; }
256<span class="property">.nav</span> { <span class="property">grid-area</span>: <span class="highlight">nav</span>; }
257<span class="property">.main</span> { <span class="property">grid-area</span>: <span class="highlight">main</span>; }
258<span class="property">.sidebar</span> { <span class="property">grid-area</span>: <span class="highlight">sidebar</span>; }
259<span class="property">.footer</span> { <span class="property">grid-area</span>: <span class="highlight">footer</span>; }
260 </div>
261 </div>
262
263 <script>
264 const layouts = {
265 desktop: {
266 class: '',
267 areas: '"header header header header" "nav main main sidebar" "nav main main sidebar" "footer footer footer footer"',
268 columns: '200px 1fr 1fr 250px',
269 rows: '80px 1fr 1fr 60px',
270 description: 'Desktop Layout with Named Areas'
271 },
272 tablet: {
273 class: 'tablet-layout',
274 areas: '"header header header" "nav main sidebar" "nav main sidebar" "footer footer footer"',
275 columns: '180px 1fr 200px',
276 rows: '80px 1fr 1fr 60px',
277 description: 'Tablet Layout - Condensed'
278 },
279 mobile: {
280 class: 'mobile-layout',
281 areas: '"header" "nav" "main" "sidebar" "footer"',
282 columns: '1fr',
283 rows: '80px 100px 1fr 120px 60px',
284 description: 'Mobile Layout - Stacked'
285 },
286 magazine: {
287 class: 'magazine-layout',
288 areas: '"masthead masthead masthead" "featured featured sidebar" "article1 article2 sidebar" "footer footer footer"',
289 columns: '1fr 1fr 300px',
290 rows: '100px 200px 1fr 80px',
291 description: 'Magazine Layout Pattern'
292 },
293 dashboard: {
294 class: 'dashboard-layout',
295 areas: '"sidebar header header toolbar" "sidebar main main toolbar" "sidebar main main toolbar" "sidebar footer footer footer"',
296 columns: '220px 1fr 1fr 180px',
297 rows: '70px 1fr 1fr 50px',
298 description: 'Dashboard Layout Pattern'
299 }
300 };
301
302 function setLayout(type) {
303 const layout = document.getElementById('layout');
304 const codeDisplay = document.getElementById('codeDisplay');
305 const layoutData = layouts[type];
306
307 // Update active button
308 document.querySelectorAll('.layout-btn').forEach(btn => btn.classList.remove('active'));
309 event.target.classList.add('active');
310
311 // Reset classes and apply new layout
312 layout.className = 'responsive-layout ' + layoutData.class;
313
314 // Update code display
315 codeDisplay.innerHTML =
316 '<span class="comment">/* ' + layoutData.description + ' */</span>\n' +
317 '<span class="property">.responsive-layout</span> {\n' +
318 ' <span class="property">display</span>: <span class="value">grid</span>;\n' +
319 ' <span class="property">grid-template-areas</span>:\n' +
320 ' <span class="value">' + layoutData.areas + '</span>;\n' +
321 ' <span class="property">grid-template-columns</span>: <span class="value">' + layoutData.columns + '</span>;\n' +
322 ' <span class="property">grid-template-rows</span>: <span class="value">' + layoutData.rows + '</span>;\n' +
323 ' <span class="property">gap</span>: <span class="value">20px</span>;\n' +
324 '}\n\n' +
325 '<span class="comment">/* Assign items to named areas */</span>\n' +
326 '<span class="property">.header</span> { <span class="property">grid-area</span>: <span class="highlight">header</span>; }\n' +
327 '<span class="property">.nav</span> { <span class="property">grid-area</span>: <span class="highlight">nav</span>; }\n' +
328 '<span class="property">.main</span> { <span class="property">grid-area</span>: <span class="highlight">main</span>; }\n' +
329 '<span class="property">.sidebar</span> { <span class="property">grid-area</span>: <span class="highlight">sidebar</span>; }\n' +
330 '<span class="property">.footer</span> { <span class="property">grid-area</span>: <span class="highlight">footer</span>; }';
331 }
332
333 // Initialize default layout
334 document.addEventListener('DOMContentLoaded', function() {
335 setLayout('desktop');
336 });
337 </script>
338</body>
339</html>This comprehensive demo showcases the power of CSS Grid Template Areas:
🎯 Named Areas Benefits:
🔧 Professional Layout Patterns:
📱 Responsive Design Approach:
Using template areas for responsive design offers several advantages:
💡 Advanced Techniques:
This approach represents best practices for maintainable, scalable CSS Grid layouts used in professional web development.
Excellent! You've mastered CSS Grid's most powerful organizational feature. Next, we'll explore Combining Flexbox & Grid, where you'll learn when and how to use these layout methods together for optimal results. This combination approach is essential for creating sophisticated, professional layouts.
Your progress is saved in this browser, on this device only.