CSS Flexbox vs Grid: Kapan Pakai Yang Mana?
Panduan lengkap perbedaan Flexbox dan CSS Grid: satu vs dua dimensi, kapan pakai yang mana, contoh nyata, kesalahan umum, dan cara menggabungkan keduanya.
Daftar isi
Flexbox dan CSS Grid sama-sama sistem layout CSS modern, dan pertanyaan yang paling sering muncul adalah: kapan pakai yang mana? Jawaban singkatnya: pakai Flexbox saat kamu menata item dalam satu dimensi (satu baris ATAU satu kolom), dan pakai CSS Grid saat kamu menata dalam dua dimensi (baris DAN kolom sekaligus). Flexbox berpikir dari isi konten ke luar, sedangkan Grid berpikir dari kerangka layout ke dalam. Di proyek nyata kamu hampir selalu memakai keduanya berdampingan, dan contoh kode di bawah bisa langsung kamu pakai.
Kalau kamu benar-benar baru di CSS dan istilah “layout” saja masih asing, tidak apa-apa. Anggap Flexbox dan Grid sebagai dua alat untuk mengatur posisi kotak-kotak di halaman. Sebelum kamu bisa mengaturnya, kamu perlu paham bahwa setiap elemen HTML adalah sebuah kotak, konsep yang dibahas di panduan membuat website pertama. Sesudah itu, dua alat inilah yang akan kamu pakai setiap hari.
Perbedaan Fundamental
Perbedaan paling inti antara keduanya hanya satu kata: dimensi. Flexbox mengatur item pada satu sumbu saja dalam satu waktu, sementara Grid mengatur dua sumbu secara bersamaan. Dari perbedaan tunggal inilah semua perbedaan lain mengalir.
| Flexbox | CSS Grid | |
|---|---|---|
| Dimensi | 1D (baris ATAU kolom) | 2D (baris DAN kolom) |
| Pendekatan | Dari konten ke luar | Dari layout ke dalam |
| Kontrol | Item menentukan ukurannya | Grid menentukan ukuran item |
| Use case utama | Alignment, distribusi space | Layout halaman, grid gallery |
Tiap baris tabel itu artinya begini:
- Dimensi. Flexbox menyusun anak-anaknya dalam satu garis lurus. Kamu memilih apakah garis itu horizontal (
flex-direction: row) atau vertikal (flex-direction: column), tapi hanya satu arah pada satu waktu. Grid menggambar kisi yang punya kolom sekaligus baris, jadi kamu bisa menempatkan item di perpotongan keduanya. - Pendekatan. Di Flexbox, ukuran container mengikuti isi. Item-item “mengalir” dan mengisi ruang sesuai kebutuhan masing-masing, cocok saat kamu tidak tahu persis berapa banyak item atau seberapa lebar tiap item. Di Grid, kamu menggambar kerangkanya dulu (“saya mau 3 kolom, kolom kiri 250px, sisanya dibagi rata”), baru item dimasukkan ke dalam sel-sel itu.
- Kontrol ukuran. Flexbox memberi item kebebasan menentukan ukuran sendiri lewat
flex-grow,flex-shrink, danflex-basis, lalu membagi sisa ruang. Grid memegang kendali dari container:grid-template-columnsmenentukan lebar tiap kolom, dan item menyesuaikan. - Use case. Karena sifat-sifat di atas, Flexbox unggul untuk komponen kecil (navbar, toolbar, deretan tombol), sedangkan Grid unggul untuk struktur besar (layout halaman, galeri kartu, dashboard).
Kalau ukuran elemen masih terasa samar, pelajari dulu bagaimana width dan height bekerja di CSS sebelum masuk ke layout. Pemahaman itu membuat flex-basis dan minmax() jadi jauh lebih masuk akal.
Satu Dimensi vs Dua Dimensi
Inti dari seluruh perdebatan “Flexbox atau Grid” bisa diringkas jadi satu pertanyaan: apakah kamu menata dalam satu garis, atau dalam sebuah kisi? Kalau item-itemmu berbaris dalam satu arah dan boleh membungkus (wrap) seenaknya, itu pekerjaan Flexbox. Kalau kamu butuh item sejajar rapi baik secara horizontal maupun vertikal sekaligus, itu pekerjaan Grid.
Contohnya, deretan tombol di sebuah toolbar:
.toolbar {
display: flex;
gap: 0.5rem;
}Tombol-tombol ini berbaris ke kanan. Kalau layarnya sempit dan kamu tambahkan flex-wrap: wrap, tombol yang tidak muat akan turun ke baris berikutnya. Tapi tombol di baris kedua tidak wajib sejajar dengan tombol di baris pertama. Flexbox tidak peduli soal itu. Setiap baris berdiri sendiri.
Sekarang bandingkan dengan galeri foto yang harus rapi seperti kertas kotak-kotak:
.gallery {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.5rem;
}Di sini setiap foto menempati sel yang tepat. Kolom 1 baris 2 pasti sejajar dengan kolom 1 baris 1. Keteraturan dua arah inilah yang tidak bisa dijamin Flexbox tapi diberikan gratis oleh Grid.
Kapan Pakai Flexbox?
Pakai Flexbox setiap kali kamu menata sekelompok item dalam satu garis dan ingin mengatur perataan (alignment) serta pembagian ruang di antara mereka. Flexbox paling bersinar untuk komponen berukuran kecil sampai menengah yang isinya bisa berubah-ubah. Kalau kamu masih baru dengan konsepnya, mulai dari materi dasar Flexbox dulu, karena di sini fokusnya kapan memakainya. Flexbox ideal untuk:
1. Navbar
nav {
display: flex;
justify-content: space-between;
align-items: center;
}Logo di kiri dan menu di kanan dalam satu baris: satu dimensi, pas untuk Flexbox. justify-content: space-between mendorong dua kelompok item ke ujung yang berlawanan, sementara align-items: center menyejajarkan tingginya di tengah. Tanpa Flexbox, kamu dulu harus main float dan clearfix yang membuat pusing.
2. Centering
.container {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}Centering vertikal dan horizontal, yang dulu jadi meme karena susahnya, sekarang cukup 3 baris CSS. justify-content mengatur sumbu utama (main axis), align-items mengatur sumbu silang (cross axis). Kalau kamu ingin memahami dua sumbu ini lebih dalam, materi alignment Flexbox menjelaskan main axis vs cross axis dengan visual yang jelas.
3. Distribusi Space
.card-row {
display: flex;
gap: 1rem;
}
.card {
flex: 1; /* semua card ukuran sama */
}flex: 1 adalah singkatan dari flex: 1 1 0, artinya setiap card boleh tumbuh dan menyusut dengan porsi yang sama, dimulai dari basis 0. Hasilnya: semua card lebarnya identik dan mengisi seluruh baris secara merata, apa pun jumlahnya. Ganti jadi flex: 2 pada satu card dan card itu akan dapat porsi dua kali lipat.
4. Item yang Ukurannya Bervariasi
Flexbox membiarkan item menentukan ukurannya sendiri, lalu mendistribusikan sisa space. Cocok untuk toolbar, tag list, atau breadcrumb. Ambil contoh deretan tag artikel: satu tag isinya “CSS” (pendek), satu lagi “Progressive Web App” (panjang). Flexbox membiarkan tiap tag selebar isinya, lalu memberi jarak seragam di antaranya, sesuatu yang canggung dilakukan dengan lebar kolom yang kaku.
Coba Flexbox
Teori paling melekat kalau kamu langsung mengutak-atiknya. Ubah properti di demo di bawah ini dan perhatikan bagaimana item bergeser secara real time:
Coba Sendiri
.container {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: flex-start;
}Mau eksperimen lebih jauh? Ada playground Flexbox interaktif dengan semua properti lengkap, atau kalau mau sambil main, coba game Kodok Flexbox, tempat kamu memandu kodok ke daun teratai pakai justify-content dan align-items. Untuk pembahasan Flexbox yang benar-benar tuntas, ada juga artikel mendalam Memahami Flexbox di blog ini.
Kapan Pakai CSS Grid?
Pakai CSS Grid setiap kali kamu perlu menata dalam dua dimensi, yaitu ketika item harus sejajar rapi baik antar-kolom maupun antar-baris. Grid adalah alat terbaik untuk kerangka besar sebuah halaman dan untuk susunan yang teratur seperti tabel atau galeri. Belum familiar dengan grid-template-columns dan kawan-kawannya? Lewati dulu ke materi dasar CSS Grid. Grid ideal untuk:
1. Layout Halaman
.page {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"sidebar header"
"sidebar main"
"sidebar footer";
min-height: 100vh;
}Ini dua dimensi: kolom sidebar + konten, baris header + main + footer. Grid unggul di sini. Yang membuat grid-template-areas istimewa adalah kamu bisa “menggambar” layout pakai nama, lalu tinggal menempelkan tiap elemen ke areanya:
.sidebar { grid-area: sidebar; }
.header { grid-area: header; }
.main { grid-area: main; }
.footer { grid-area: footer; }Kode ini nyaris seperti membaca peta. Kalau kamu ingin mendalami teknik penamaan area ini, materi grid areas membahasnya langkah demi langkah.
2. Gallery / Card Grid
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 1rem;
}auto-fill + minmax = grid yang otomatis responsif tanpa media query! Terjemahan baris itu: “buat sebanyak mungkin kolom yang muat, di mana tiap kolom minimal 250px dan maksimal membagi ruang secara rata”. Di layar lebar kamu dapat 4-5 kolom; di ponsel otomatis menyusut jadi 1 kolom. Tanpa satu pun media query, jadi trik ini layak kamu hafal.
3. Dashboard Layout
.dashboard {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1.5rem;
}
.widget-large {
grid-column: span 2;
grid-row: span 2;
}Item bisa span multiple kolom dan baris, sesuatu yang sulit dilakukan dengan Flexbox. Widget besar mengambil area 2x2, widget kecil mengisi sel 1x1 di sekitarnya, dan Grid menyusun semuanya tanpa tumpang tindih. Coba tiru layout ini dengan Flexbox dan kamu akan langsung merasakan kenapa Grid ada.
Coba CSS Grid
Sama seperti Flexbox, cara tercepat memahami Grid adalah dengan menggeser-geser propertinya sendiri. Eksperimen dengan demo di bawah ini:
Coba Sendiri
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: auto;
gap: 16px;
}Untuk latihan yang lebih dalam, ada playground CSS Grid dan game Kebun Grid, tempat kamu menanam sayuran di petak kebun pakai grid-column dan grid-row. Kalau ingin bacaan panjang yang mengupas Grid dari nol, lanjut ke panduan mendalam Memahami CSS Grid.
Perbandingan Langsung
Bedanya paling kelihatan kalau masalah yang sama diselesaikan pakai kedua alat, lalu hasilnya dibandingkan. Ini dua kasus klasik yang sering membuat bingung.
Contoh: Card Layout Responsif
Dengan Flexbox:
.cards {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.card {
flex: 1 1 300px; /* grow, shrink, basis */
}Dengan Grid:
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1rem;
}Grid menjaga ukuran kolom konsisten, bahkan di baris terakhir. Satu card yang sendirian di baris terakhir tetap selebar kolom, bukan melar penuh. Untuk galeri yang benar-benar rapi, Grid hampir selalu jawabannya. (Catatan kecil: kalau kamu ingin sisa baris ikut melar, auto-fit, bukan auto-fill, akan meruntuhkan kolom kosong dan meregangkan yang ada.)
Contoh: Header dengan Logo + Menu + CTA
Dengan Flexbox (lebih cocok):
header {
display: flex;
align-items: center;
gap: 1rem;
}
.nav-links { margin-left: auto; }
.cta { margin-left: 1rem; }Trik margin-left: auto di sini mendorong menu dan CTA ke kanan, menyisakan logo sendirian di kiri. Ini teknik khas Flexbox yang tidak punya padanan sesederhana di Grid.
Dengan Grid:
header {
display: grid;
grid-template-columns: auto 1fr auto;
align-items: center;
}Keduanya bisa, tapi Flexbox lebih natural untuk kasus ini karena itemnya bervariasi ukuran dan hanya satu baris. Grid akan memaksamu memikirkan jumlah kolom, padahal isinya satu deret sederhana.
Mini-Project: Kerangka Landing Page
Contoh utuh berikut mencerminkan proyek nyata: kerangka landing page dengan header, hero, grid fitur, dan footer. Perhatikan bagaimana Grid dan Flexbox mengambil peran masing-masing tanpa saling menginjak.
Mulai dari HTML-nya:
<body>
<header class="site-header">
<div class="logo">BelajarWeb</div>
<nav class="nav-links">
<a href="#">Materi</a>
<a href="#">Blog</a>
<a href="#">Masuk</a>
</nav>
</header>
<main>
<section class="hero">
<h1>Belajar Web Development dari Nol</h1>
<p>Interaktif, gratis, dan berbahasa Indonesia.</p>
<button>Mulai Sekarang</button>
</section>
<section class="features">
<article class="feature">Materi Terstruktur</article>
<article class="feature">Latihan Interaktif</article>
<article class="feature">Komunitas Aktif</article>
</section>
</main>
<footer class="site-footer">© 2026 BelajarWeb</footer>
</body>Sekarang CSS-nya. Pertama, kerangka besar halaman pakai Grid karena kita menata beberapa baris besar (header, main, footer) dari atas ke bawah:
body {
display: grid;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
margin: 0;
}auto 1fr auto artinya header dan footer setinggi isinya, sedangkan main mengambil semua sisa ruang. Inilah yang membuat footer “menempel” di bawah bahkan saat konten sedikit (pola sticky footer klasik).
Berikutnya, header. Isinya hanya satu baris berisi logo dan menu, jadi ini tugas Flexbox:
.site-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
}
.nav-links {
display: flex;
gap: 1.5rem;
}Lalu hero. Kita ingin judul, paragraf, dan tombol tersusun vertikal dan terpusat, jadi Flexbox arah kolom:
.hero {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1rem;
text-align: center;
padding: 4rem 1rem;
}Terakhir, grid fitur. Tiga kartu yang harus rapi dan responsif adalah murni tugas Grid:
.features {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 1.5rem;
padding: 2rem;
}
.feature {
padding: 2rem;
border: 1px solid #e5e7eb;
border-radius: 0.5rem;
}Hasil akhirnya: satu halaman di mana Grid mengatur struktur vertikal besar, Flexbox menata isi tiap bagian, dan Grid lagi untuk galeri fitur. Pola ini akan kamu tulis berulang kali sepanjang karier front-end. Setelah paham polanya, kamu tinggal menerapkannya di framework mana pun. Saat membangun UI di React dari nol, misalnya, struktur CSS-nya persis sama.
Menggabungkan Keduanya
Dalam praktik, kamu hampir selalu menggabungkan Flexbox dan Grid, dengan memakai alat yang tepat di setiap tingkatan sarang (nesting).
/* Grid untuk layout utama */
.page {
display: grid;
grid-template-columns: 250px 1fr;
}
/* Flexbox untuk navbar di dalam grid */
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
}
/* Grid untuk card section */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1rem;
}
/* Flexbox untuk konten di dalam card */
.card {
display: flex;
flex-direction: column;
justify-content: space-between;
}Contoh terakhir itu, .card sebagai flex column dengan justify-content: space-between, adalah pola emas untuk kartu yang tingginya sama tapi isinya beda panjang: judul menempel di atas, tombol menempel di bawah, dan ruang kosong terdistribusi di tengah. Sebuah kartu bisa jadi grid item (di mata .card-grid) sekaligus flex container (untuk isinya sendiri) pada waktu bersamaan. Tidak ada konflik; keduanya beroperasi di lapisan berbeda.
Flexbox dan Grid di Tailwind CSS
Semua konsep di atas berlaku sama persis di Tailwind CSS, hanya sintaksnya berubah dari properti CSS jadi utility class. display: flex menjadi flex, justify-content: space-between menjadi justify-between, dan display: grid menjadi grid. Prinsip satu-vs-dua dimensinya tidak berubah sedikit pun.
<!-- Flexbox: navbar -->
<nav class="flex items-center justify-between">
<span>Logo</span>
<div class="flex gap-6">Menu</div>
</nav>
<!-- Grid: galeri responsif -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<article>Card</article>
<article>Card</article>
<article>Card</article>
</div>Karena utility-nya bernama nyaris identik dengan properti CSS aslinya, memahami Flexbox dan Grid “murni” dulu membuat Tailwind terasa gampang. Kamu tinggal menerjemahkan. Materi Grid di Tailwind menunjukkan padanan lengkapnya, dan kalau kamu baru mau memulai Tailwind, ada panduan Tailwind CSS untuk pemula di blog ini.
Kesalahan Umum
Kebanyakan masalah layout bukan karena Flexbox atau Grid “bug”, melainkan karena salah memilih alat atau salah paham cara kerja sumbunya. Berikut kesalahan yang paling sering kutemui.
1. Memaksa Flexbox untuk layout dua dimensi. Gejalanya: kamu menumpuk banyak flex-wrap dan menghitung lebar flex-basis manual supaya baris-baris sejajar. Kalau kamu sudah berjuang keras agar item di baris kedua sejajar dengan baris pertama, itu tanda kamu butuh Grid. Berhenti melawan Flexbox.
2. Tertukar antara justify-content dan align-items. Di Flexbox, justify-content bekerja di sepanjang sumbu utama (arah flex-direction), sedangkan align-items bekerja di sumbu silang (tegak lurus). Begitu kamu mengubah flex-direction: column, keduanya bertukar peran: justify-content sekarang mengatur vertikal, align-items mengatur horizontal. Ini sumber kebingungan nomor satu bagi pemula.
3. Pakai margin dan padding untuk memberi jarak antar item, bukan gap. Dulu kita terpaksa main margin karena gap belum didukung Flexbox. Sekarang gap sudah bekerja mulus di Flexbox maupun Grid. Pakai gap: lebih bersih dan tidak meninggalkan margin berlebih di item pertama atau terakhir.
/* Hindari cara lama */
.item { margin-right: 1rem; }
/* Pakai cara modern */
.container { display: flex; gap: 1rem; }4. Lupa bahwa height: 100% butuh induk yang tinggi. Persentase tinggi mengacu ke tinggi elemen induk. Kalau induk tidak punya tinggi eksplisit, height: 100% tidak berefek. Ini bagian dari cara kerja properti dimensi yang dibahas tuntas di artikel width dan height. Untuk mengisi tinggi layar, min-height: 100vh biasanya lebih andal.
5. Menganggap Grid selalu lebih “canggih” jadi harus dipakai di mana-mana. Grid bukan versi upgrade dari Flexbox. Untuk satu deretan tombol atau proses centering sederhana, Flexbox lebih ringkas dan lebih ekspresif. Pilih berdasarkan bentuk masalah, bukan berdasarkan mana yang terdengar lebih keren.
6. Bingung kenapa justify-content: center tidak menengahkan apa pun. Cek dulu: apakah container-nya benar sudah display: flex atau display: grid? Tanpa salah satunya, properti-properti itu tidak punya arti. Kesalahan sepele ini memakan lebih banyak waktu debugging daripada yang layak.
Cheat Sheet
Gunakan Flexbox saat:
- Layout satu baris atau satu kolom
- Centering konten
- Distribusi space antar item
- Item dengan ukuran yang bervariasi
- Komponen kecil (navbar, toolbar, form row)
Gunakan Grid saat:
- Layout dua dimensi (baris DAN kolom)
- Layout halaman utama
- Gallery atau card grid
- Item perlu span multiple kolom/baris
- Kamu ingin kontrol presisi atas placement
Kamu membuat galeri foto yang harus rapi sejajar baik antar-baris maupun antar-kolom, dan tetap responsif tanpa media query. Alat mana yang paling tepat?
FAQ
Apa perbedaan Flexbox dan Grid dalam satu kalimat?
Flexbox menata item dalam satu dimensi (satu baris atau satu kolom), sedangkan Grid menata dalam dua dimensi (baris dan kolom sekaligus). Flexbox berangkat dari konten, Grid berangkat dari kerangka layout.
Mana yang harus dipelajari lebih dulu, Flexbox atau Grid?
Pelajari Flexbox lebih dulu. Konsepnya lebih sederhana (hanya satu sumbu), langsung berguna untuk navbar dan centering yang kamu butuhkan hampir di setiap proyek, dan pemahaman soal main axis vs cross axis akan mempermudah saat kamu naik ke Grid. Setelah nyaman dengan Flexbox, lanjut ke Grid untuk layout halaman.
Apakah Flexbox dan Grid bisa dipakai bersamaan?
Bisa, dan justru itu praktik yang paling umum. Kamu biasanya memakai Grid untuk kerangka besar halaman lalu Flexbox untuk menata isi di dalam tiap bagian. Satu elemen bahkan bisa menjadi grid item dan flex container sekaligus, keduanya bekerja di lapisan yang berbeda tanpa saling bertabrakan.
Apakah Grid menggantikan Flexbox?
Tidak. Grid tidak menggantikan Flexbox; keduanya melengkapi. Untuk susunan satu dimensi seperti deretan tombol atau centering sederhana, Flexbox lebih ringkas. Untuk struktur dua dimensi seperti galeri atau layout halaman, Grid lebih tepat. Pilih sesuai bentuk masalahnya.
Bagaimana cara membuat layout responsif tanpa media query?
Pakai Grid dengan grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)). Baris ini otomatis menambah atau mengurangi jumlah kolom sesuai lebar layar, menjaga tiap kolom minimal 250px. Untuk Flexbox, kombinasi flex-wrap: wrap dengan flex: 1 1 250px memberi efek serupa meski kurang rapi di baris terakhir.
Apakah Flexbox dan Grid didukung semua browser?
Ya. Baik Flexbox maupun CSS Grid sudah didukung penuh oleh semua browser modern (Chrome, Firefox, Safari, Edge) selama bertahun-tahun. Kamu bisa memakainya dengan tenang di proyek produksi tanpa perlu prefix vendor atau fallback khusus untuk mayoritas kasus.
Kesimpulan
Flexbox dan Grid saling melengkapi. Yang perlu kamu latih adalah memilih kapan pakai yang mana, dan kapan menggabungkan keduanya.
Aturan simpel yang bisa kamu bawa pulang: kalau kamu berpikir dalam baris atau kolom, mulai dengan Flexbox. Kalau kamu berpikir dalam grid/tabel dengan keteraturan dua arah, mulai dengan CSS Grid. Dan hampir setiap halaman nyata memakai keduanya: Grid untuk kerangka, Flexbox untuk isi.
Mau menyelami masing-masing lebih dalam? Baca pembahasan lengkap Flexbox dan panduan mendalam CSS Grid di blog ini.
Sudah paham? Sekarang coba sendiri.
Buka materinya di Hyper Sheets: latihan interaktif, playground, dan game untuk topik ini. Gratis, langsung di browser.