Studi Kasus: Centering Sempurna
Menengahkan apa pun secara vertikal dan horizontal: modal, hero, empty state.
Resep universal
.tengah {
display: flex;
justify-content: center; /* horizontal */
align-items: center; /* vertikal */
min-height: 100vh; /* butuh tinggi! */
}Tanpa tinggi yang jelas, tidak ada "tengah vertikal" karena wadah hanya setinggi kontennya. min-height: 100vh (atau tinggi pasti) adalah syaratnya.
Varian: satu item dengan margin auto
.wadah { display: flex; }
.item { margin: auto; } /* tengah dua arah sekaligus */margin: auto pada flex item menengahkan di kedua sumbu sekaligus. Berguna kalau hanya satu item yang perlu ditengahkan.
Studi kasus: modal
.overlay {
position: fixed;
inset: 0; /* top+right+bottom+left: 0 */
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
}
.modal {
background: white;
padding: 32px;
border-radius: 16px;
max-width: 400px;
}inset: 0 adalah shorthand modern untuk keempat sisi sekaligus.
Catatan teknis: untuk teks satu baris,
text-align: center+line-heightmasih valid dan lebih ringan. Flexbox centering untuk kasus yang benar-benar butuh dua dimensi.
Kenapa butuh tinggi pasti?
" Tengah vertikal" hanya bermakna bila ada ruang lebih untuk dibagi. Wadah setinggi kontennya tidak punya ruang lebih: tidak ada yang bisa "ditengahkan". min-height: 100vh (atau tinggi parent yang pasti) menciptakan ruang itu.
Contoh: hero fullscreen
.hero {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
min-height: 100vh;
text-align: center;
padding: 24px;
}Judul + subjudul + tombol selalu di tengah layar, berapa pun tinggi viewport.
Contoh: empty state
.kosong {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
min-height: 300px;
color: #64748b;
border: 2px dashed #e2e8f0;
border-radius: 12px;
}Jebakan
Centering dengan position absolute + margin negatif. Teknik lama yang rapuh (butuh tahu ukuran elemen). Flexbox centering tidak peduli ukuran konten.
Lupa text-align: center. Flexbox menengahkan KOTAK elemen; teks di dalamnya tetap rata kiri kecuali text-align: center. Untuk hero, hampir selalu butuh keduanya.
Tips profesional
- Untuk overlay loading fullscreen:
position: fixed; inset: 0; display: flex; justify-content: center; align-items: center;. place-content: centeradalah shorthand untukalign-content+justify-content.- Centering tidak selalu flexbox: teks satu baris cukup
text-align: center+line-heightyang lebih ringan.
Pola siap salin: overlay loading
.loading-overlay {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(255, 255, 255, 0.8);
z-index: 50;
}Spinner di tengah layar yang menutupi seluruh halaman saat data dimuat. Ganti background dengan gelap untuk tema malam.
Rangkuman
Centering 2D = flex + justify-center + align-center + tinggi pasti. Untuk modal: overlay fixed dengan inset 0 + flex centering. Hafalkan pola ini.
export default function App(): JSX.Element { return <h1>Hello world</h1> }
Tantangan
Empty State
Di playground:
- Ubah kartu menjadi "empty state": ganti isi dengan teks "Belum ada data" + tombol "Tambah Data". Tetap di tengah.
- Hapus
min-height: 100vh, amati kartu menempel ke atas. Jelaskan di komentar kenapa tinggi wajib ada. - Buat varian memakai
margin: autopada kartu (tanpa justify/align di panggung).
<!doctype html> <html> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="styles.css" /> </head> <body> <h1>Halo CSS</h1> <p>Edit styles.css dan lihat hasilnya.</p> </body> </html>
Kuis Bab
Uji pemahamanmu: Flexbox
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.justify-content mengatur perataan pada sumbu apa?
2.Bagaimana menengahkan satu elemen vertikal dan horizontal dengan flexbox?
3.Apa arti flex: 1?
4.Bagaimana mendorong tombol ke dasar kartu flex kolom walau teks beda panjang?
5.Kenapa gap lebih baik dari margin untuk jarak antar flex item?