- Bab 7 dari 10
- 35 menit
- 1 latihan kode
- 4 soal kuis
Flexbox dan Grid
Di bab ini (8 bagian)
Tujuan bab ini
- Menyusun elemen dalam satu baris atau kolom dengan Flexbox.
- Membuat layout baris dan kolom dengan CSS Grid, termasuk
fr,repeat(), danminmax(). - Memilih kapan memakai Flexbox dan kapan memakai Grid.
- Mengenal multi-column layout untuk teks ala koran.
Kenapa butuh Flexbox dan Grid?
Dulu, menaruh tiga kartu sejajar atau membuat sesuatu benar-benar di tengah layar butuh trik float, inline-block, dan hitungan margin yang rapuh. Flexbox dan Grid hadir sebagai modul layout CSS3 yang memang dirancang untuk itu. Sekarang keduanya didukung semua browser modern, jadi tidak ada alasan memakai trik lama.
Flexbox: tata letak satu dimensi
Flexbox mengatur item di satu arah: baris atau kolom. Ada dua peran:
- Flex container: induk yang diberi
display: flex. - Flex item: anak langsung container. Cucu tidak ikut, kecuali induknya juga dijadikan flex.
Hasilnya: tiga link berjejer dalam satu baris, Logo menempel kiri, Masuk menempel kanan, Kelas di tengah, dan semuanya rata tengah secara vertikal.
Dua sumbu
Kunci memahami Flexbox adalah main axis (sumbu utama) dan cross axis (sumbu silang). flex-direction menentukan main axis.
| Properti | Fungsi | Nilai umum |
|---|---|---|
flex-direction | arah main axis | row (default), column, row-reverse, column-reverse |
justify-content | perataan di main axis | flex-start, center, space-between, space-around |
align-items | perataan di cross axis | stretch (default), center, flex-start, flex-end |
flex-wrap | boleh pindah baris? | nowrap (default), wrap |
gap | jarak antar item | 16px, 1rem |
Saat flex-direction: column, sumbunya bertukar: justify-content jadi mengatur vertikal dan align-items mengatur horizontal. Ini sering bikin bingung, jadi ingat saja: justify selalu ikut arah item mengalir.
Perhatikan juga nilai default align-items: stretch. Karena itu, item dalam satu baris flex otomatis sama tinggi walau isinya berbeda panjang. Ini sangat berguna untuk deretan kartu: kartu dengan deskripsi pendek tetap setinggi kartu dengan deskripsi panjang, tanpa perlu menulis height sama sekali. Kalau kamu tidak ingin efek ini, ganti dengan flex-start atau center.
Trik legendaris menaruh sesuatu tepat di tengah:
flex-wrap dan flex: 1
Secara default item flex dipaksa muat dalam satu baris dan akan menyusut. Dengan flex-wrap: wrap, item yang tidak muat turun ke baris berikutnya, cocok untuk deretan kartu.
Properti flex di item mengatur cara item berbagi ruang sisa. flex: 1 adalah singkatan flex-grow: 1; flex-shrink: 1; flex-basis: 0%, artinya "ambil bagian yang sama dari ruang tersedia".
Kalau ada tiga .kolom dan salah satunya .lebar, ruang dibagi 1 : 1 : 2. Pola lain yang sering dipakai: kolom pencarian flex: 1 di samping tombol berukuran tetap, sehingga input mengisi semua sisa lebar.
CSS Grid: tata letak dua dimensi
Grid mengatur baris dan kolom sekaligus. Kamu mendefinisikan "lintasan" di container, lalu item mengisi sel-selnya secara otomatis dari kiri ke kanan, atas ke bawah.
Kolom pertama tetap 250px, dua kolom lainnya berbagi sisa ruang sama rata.
Unit fr, repeat(), dan minmax()
fr(fraction) membagi ruang sisa setelah ukuran tetap dan gap dikurangi. Di container 1000px dengan200px 1fr 3frdan tanpa gap, sisa 800px dibagi 4 bagian, jadi kolomnya 200px, 200px, 600px.repeat(4, 1fr)sama dengan1fr 1fr 1fr 1fr, lebih ringkas.minmax(200px, 1fr)berarti "minimal 200px, maksimal satu bagian".
Gabungan paling terkenal untuk galeri responsif tanpa media query:
Di layar lebar muat empat atau lima kolom, di HP otomatis tinggal satu kolom, karena browser menghitung berapa kolom 200px yang muat lalu membagi sisa ruang.
grid-area singkat
Untuk layout halaman, grid-template-areas membuat CSS terbaca seperti denah:
Header membentang dua kolom, sidebar di kiri bawah, dan main di kanan bawah. Nama area harus membentuk persegi panjang. Untuk kasus kecil, kamu juga bisa memakai grid-column: 1 / 3 (dari garis 1 sampai garis 3) atau grid-column: span 2.
Flex atau Grid?
| Situasi | Pilihan |
|---|---|
| Item dalam satu baris: navbar, tombol berjejer, input + tombol | Flexbox |
| Ukuran item ditentukan isinya | Flexbox |
| Layout halaman: header, sidebar, main, footer | Grid |
| Galeri atau kartu yang harus rapi sejajar di baris dan kolom | Grid |
Keduanya bukan saingan. Di proyek nyata kamu sering memakai Grid untuk kerangka halaman, lalu Flexbox di dalam tiap kartu atau navbar.
Multi-column layout singkat
Untuk teks panjang seperti artikel, modul multi-column membagi isi ke beberapa kolom ala koran tanpa markup tambahan:
Teks mengalir otomatis dari kolom pertama ke kolom berikutnya, dengan garis tipis di antara kolom, dan judul membentang melintasi semua kolom. Pakai column-width: 250px jika ingin browser sendiri yang menentukan jumlah kolom, dan break-inside: avoid agar satu blok tidak terpotong di dua kolom.
Kesalahan umum
- Menaruh
display: flexpada item, bukan pada induknya. - Mengira
justify-contentselalu horizontal. Padaflex-direction: column, ia mengatur vertikal. - Lupa
flex-wrap: wrap, sehingga kartu menyusut gepeng dalam satu baris. - Memakai margin di setiap item padahal
gaplebih rapi. - Menulis
grid-template-columns: 3dan berharap muncul tiga kolom. Yang benarrepeat(3, 1fr).
Rangkuman
- Flexbox untuk satu dimensi:
display: flexdi container, atur denganflex-direction,justify-content,align-items,flex-wrap, dangap. flex: 1membuat item berbagi ruang sisa secara proporsional.- Grid untuk dua dimensi:
grid-template-columnsdenganfr,repeat(), danminmax(). grid-template-areasdangrid-areamembuat layout halaman terbaca seperti denah.- Grid untuk kerangka, Flexbox untuk isi. Multi-column untuk teks ala koran.
Slide 15 sampai 17 dari deck HTML5 dan CSS3. Penjelasan lengkapnya ada di mode Baca.

Selesaikan bab ini
- 1. Baca materi
- 2. Latihan kode (1)
- 3. Kuis (4 soal)
Latihan kode: Navbar flex dan galeri grid
HTML-nya sudah jadi, jangan diubah. Tulis CSS agar:
.navbarmenjadi flex container denganalign-items: centerdangap: 12px.- Input
.carimengisi semua sisa lebar navbar denganflex: 1. .galerimenjadi grid tiga kolom sama lebar (repeat(3, 1fr)) dengangap: 16px. Lebar galeri sudah 632px, jadi tiap kolom 200px.- Kartu pertama membentang dua kolom (
grid-column: span 2).
Cek pemahaman
1Pada container dengan `flex-direction: column`, properti mana yang mengatur perataan item secara vertikal?
2Berapa lebar kolom ketiga?
.grid { display: grid; width: 1000px; grid-template-columns: 160px 1fr 3fr; gap: 20px; }3Agar item berjejer, `display: flex` harus ditulis pada setiap item.
4Mana yang paling cocok dibuat dengan CSS Grid?
