cssflexboxcenteringMenengah4 mnt baca

Studi Kasus: Centering Sempurna

Menengahkan apa pun secara vertikal dan horizontal: modal, hero, empty state.

Resep universal

css
.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

css
.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

css
.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-height masih 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

css
.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

css
.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: center adalah shorthand untuk align-content + justify-content.
  • Centering tidak selalu flexbox: teks satu baris cukup text-align: center + line-height yang lebih ringan.

Pola siap salin: overlay loading

css
.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.

Live Playground
export default function App(): JSX.Element {
  return <h1>Hello world</h1>
}

Edit kode di kiri, preview kanan ter-update otomatis.

Tantangan

Empty State

Di playground:

  1. Ubah kartu menjadi "empty state": ganti isi dengan teks "Belum ada data" + tombol "Tambah Data". Tetap di tengah.
  2. Hapus min-height: 100vh, amati kartu menempel ke atas. Jelaskan di komentar kenapa tinggi wajib ada.
  3. Buat varian memakai margin: auto pada 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?