Tutorial CSS Grid Layout: Layout Modern untuk Website yang Responsive dan Keren
Bayangin ini: dulu bikin layout 3 kolom yang responsive itu kayak masak rendang—butuh waktu lama dan ribet. Dengan CSS Grid, jadi kayak masak mie instan—cepat, mudah, dan hasilnya tetap enak. Grid adalah game-changer yang bikin layout complex jadi sederhana.
Di tutorial ini, kita akan belajar CSS Grid dari dasar sampai advanced. Aku janji bakal jelasin dengan analogi yang mudah dimengerti, plus contoh code yang langsung bisa dipraktikin. Siap-siap ningkatin skill layout-mu ke level pro!
Apa Itu CSS Grid dan Kenapa Dia Revolusioner?
CSS Grid adalah sistem layout 2 dimensi—artinya bisa ngatur element secara baris dan kolom sekaligus. Kalau Flexbox itu 1 dimensi (either horizontal or vertical), Grid itu kayak punya kendali penuh atas X dan Y axis.
Perbandingan Grid vs Flexbox
CSS Grid | Flexbox |
---|---|
📐 2 Dimensi (rows & columns) | 📏 1 Dimensi (either rows OR columns) |
🎯 Layout macro (keseluruhan halaman) | 🔧 Layout micro (komponen kecil) |
📊 Explicit control over both axes | 📱 Implicit flow along one axis |
💪 Powerful untuk complex layouts | ⚡ Simple untuk content distribution |
Browser Support yang Luar Biasa
Good news! CSS Grid didukung oleh 98% browser worldwide. Jadi nggak perlu takut pakai teknologi baru ini.
Konsep Dasar CSS Grid yang Wajib Dipahami
Sebelum masuk ke coding, mari pahami vocabulary Grid:
1. Grid Container vs Grid Items
<div class="grid-container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
.grid-container {
display: grid; /* Ini Grid Container */
}
.item {
/* Ini Grid Items */
}
2. Grid Lines – Garis Pembatas
Garis vertikal dan horizontal yang membentuk grid. Diberi nomor mulai dari 1.
3. Grid Tracks – Baris dan Kolom
Spasi antara dua grid lines yang adjacent (sejajar).
4. Grid Cells – Sel Individual
Unit terkecil di grid (pertemuan satu baris dan satu kolom).
5. Grid Areas – Area yang Ditandai
Sekumpulan cells yang membentuk area rectangular.
Membuat Grid Pertama: From Zero to Hero
Mari mulai dengan contoh sederhana:
Basic Grid Setup
<div class="grid-basic">
<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>
.grid-basic {
display: grid;
grid-template-columns: 200px 200px 200px; /* 3 kolom @200px */
grid-template-rows: 100px 100px; /* 2 baris @100px */
gap: 20px; /* jarak antar item */
}
.item {
background: #4CAF50;
color: white;
padding: 20px;
text-align: center;
}
Hasilnya:
Unit dan Function Magis di CSS Grid
1. fr Unit – Fractional Unit
Unit yang membagi available space secara proporsional.
.grid-fr {
display: grid;
grid-template-columns: 1fr 2fr 1fr; /* Kolom tengah 2x lebih lebar */
}
2. repeat() Function – Pengulangan Smart
.grid-repeat {
display: grid;
/* Sama dengan: 1fr 1fr 1fr 1fr */
grid-template-columns: repeat(4, 1fr);
/* Auto-fit untuk responsive */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
3. minmax() Function – Flexible Sizing
.grid-minmax {
display: grid;
/* Minimal 200px, maksimal sebesar available space */
grid-template-columns: minmax(200px, 1fr) minmax(300px, 2fr);
}
Positioning Items di Grid
Kontrol tepat dimana item harus ditempatkan:
1. Line-based Placement
.item-1 {
/* Mulai dari line 1, sampai line 3 */
grid-column-start: 1;
grid-column-end: 3;
/* Shorthand: grid-column: 1 / 3; */
}
.item-2 {
/* Mulai dari baris 1, sampai baris 3 */
grid-row: 1 / 3;
}
2. span Keyword
.item-special {
/* Mulai dari kolom 2, ambil 2 kolom */
grid-column: 2 / span 2;
/* Mulai dari baris 1, ambil 3 baris */
grid-row: span 3;
}
3. Grid Area Names
.grid-areas {
display: grid;
grid-template-areas:
"header header header"
"sidebar content content"
"footer footer footer";
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.content { grid-area: content; }
.footer { grid-area: footer; }
Responsive Grid dengan Auto-fit dan Auto-fill
Ini adalah magic responsive grid!
Auto-fit vs Auto-fill
.grid-responsive {
display: grid;
gap: 20px;
/* Auto-fit: create as many tracks as FIT the container */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
/* Auto-fill: create as many tracks as FILL the container */
/* grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); */
}
Contoh Perbedaan:
Container Width | Auto-fit | Auto-fill |
---|---|---|
500px | 2 kolom (250px each) | 2 kolom (250px each) |
800px | 3 kolom (266px each) | 3 kolom + empty space |
Real Project: Membuat Layout Website Modern
Mari buat layout website lengkap dengan CSS Grid!
HTML Structure
<div class="website-layout">
<header class="header">Header</header>
<nav class="navbar">Navigation</nav>
<aside class="sidebar">Sidebar</aside>
<main class="main-content">Main Content</main>
<section class="ads">Advertisement</section>
<footer class="footer">Footer</footer>
</div>
CSS Grid Implementation
.website-layout {
display: grid;
grid-template-columns: 250px 1fr 200px;
grid-template-rows: 80px 60px 1fr 100px;
grid-template-areas:
"header header header"
"navbar navbar navbar"
"sidebar main ads"
"footer footer footer";
gap: 20px;
min-height: 100vh;
}
.header {
grid-area: header;
background: #2c3e50;
color: white;
padding: 20px;
}
.navbar {
grid-area: navbar;
background: #34495e;
color: white;
padding: 15px;
}
.sidebar {
grid-area: sidebar;
background: #ecf0f1;
padding: 20px;
}
.main-content {
grid-area: main;
background: white;
padding: 30px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.ads {
grid-area: ads;
background: #f39c12;
padding: 20px;
}
.footer {
grid-area: footer;
background: #2c3e50;
color: white;
padding: 20px;
text-align: center;
}
/* Responsive Design */
@media (max-width: 768px) {
.website-layout {
grid-template-columns: 1fr;
grid-template-rows: auto;
grid-template-areas:
"header"
"navbar"
"main"
"sidebar"
"ads"
"footer";
}
}
Advanced Grid Techniques
1. Nested Grids
.parent-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.child-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
/* Grid di dalam grid! */
}
2. Grid dengan Masonry Layout
.masonry-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
grid-auto-rows: 10px; /* Base height unit */
grid-gap: 15px;
}
.masonry-item {
/* Set height berdasarkan content */
grid-row-end: span 30; /* Adjust berdasarkan kebutuhan */
}
3. Alignment dan Justification
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
height: 400px;
/* Align items vertically */
align-items: start; /* end, center, stretch */
/* Justify items horizontally */
justify-items: center; /* start, end, stretch */
/* Align seluruh grid content */
align-content: space-between;
justify-content: space-around;
}
CSS Grid vs Flexbox: Kapan Pakai Yang Mana?
Gunakan CSS Grid ketika:
- 🔄 Butuh kontrol 2 dimensi (rows & columns)
- 📐 Layout complex dengan overlapping areas
- 🎯 Precise placement of items
- 📊 Grid-based designs (magazine layouts)
Gunakan Flexbox ketika:
- 📱 Satu dimensi cukup (either horizontal OR vertical)
- 🔧 Content distribution dalam container
- 📏 Aligning items along one axis
- 🛠️ Navigation bars, card layouts
Browser Support dan Fallbacks
Feature Queries untuk Graceful Degradation
/* Fallback untuk browser lama */
.layout {
display: flex;
flex-wrap: wrap;
}
/* CSS Grid untuk browser modern */
@supports (display: grid) {
.layout {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
}
Best Practices CSS Grid
1. Naming Grid Lines
.named-grid {
display: grid;
grid-template-columns: [sidebar-start] 250px [sidebar-end content-start] 1fr [content-end];
grid-template-rows: [header-start] 100px [header-end main-start] 1fr [main-end];
}
.item {
grid-column: sidebar-start / content-end;
}
2. Use minmax() untuk Responsiveness
.responsive-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
}
3. Gap vs Margin
Gunakan gap
untuk konsistensi, bukan margin individual.
Project Challenge: Portfolio Gallery
Coba buat gallery portfolio yang responsive!
<div class="portfolio-grid">
<div class="portfolio-item item-1">Project 1</div>
<div class="portfolio-item item-2">Project 2</div>
<div class="portfolio-item item-3">Project 3</div>
<div class="portfolio-item item-4">Project 4</div>
<div class="portfolio-item item-5">Project 5</div>
</div>
.portfolio-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
grid-auto-rows: 200px;
gap: 20px;
padding: 20px;
}
.portfolio-item {
background-size: cover;
background-position: center;
border-radius: 10px;
display: flex;
align-items: end;
padding: 20px;
color: white;
font-weight: bold;
text-shadow: 1px 1px 3px rgba(0,0,0,0.8);
}
.item-1 {
grid-column: span 2;
background-image: url('project1.jpg');
}
.item-2 {
background-image: url('project2.jpg');
}
.item-3 {
background-image: url('project3.jpg');
}
.item-4 {
grid-row: span 2;
background-image: url('project4.jpg');
}
.item-5 {
background-image: url('project5.jpg');
}
@media (max-width: 768px) {
.item-1 {
grid-column: 1;
}
.item-4 {
grid-row: 1;
}
}
Debugging CSS Grid
Browser Dev Tools untuk Grid
Gunakan browser dev tools untuk visualize grid:
- Chrome: Inspect element → Grid tab
- Firefox: Layout panel → Grid display
- Bisa lihat grid lines, areas, dan tracks
Kesimpulan: CSS Grid adalah Masa Depan Web Layout
Selamat! Kamu sudah menguasai CSS Grid—salah satu skill paling powerful untuk modern web development.
Yang sudah dipelajari:
- ✅ Konsep dasar CSS Grid dan terminology
- ✅ Grid container vs grid items
- ✅ Advanced units (fr, repeat(), minmax())
- ✅ Responsive grid dengan auto-fit/auto-fill
- ✅ Real-world website layout
- ✅ Advanced techniques dan best practices
CSS Grid bukan cuma tool, tapi paradigm shift dalam cara kita berpikir tentang web layout. Dengan menguasainya, kamu bisa bikin design complex yang dulu butuh ratusan line CSS, sekarang cuma butuh beberapa line saja.
Sekarang waktunya practice! Coba redesign website lama kamu dengan CSS Grid, atau buat layout baru dari scratch. The more you practice, the more magical it becomes!
“CSS Grid is the most powerful layout system available in CSS. It is a 2-dimensional system, meaning it can handle both columns and rows.” – MDN Web Docs