Seluruh perkakas flexbox telah kita pegang: dua sumbu, arah, penjajaran, pembungkusan, distribusi ruang, dan gap. Chapter penutup ini menyatukannya menjadi lima pola yang muncul terus-menerus di kode produksi — navbar, perfect centering, media object, kartu dengan footer terdorong, dan sticky footer. Setiap pola hanya memakai beberapa deklarasi dari chapter-chapter sebelumnya, sehingga membacanya sekaligus menjadi latihan mengenali “pola mana yang sedang bekerja” pada kode orang lain.
Navbar dengan space-between #
Pola navbar paling lazim terdiri atas dua gugus: brand di kiri dan menu di kanan. Daripada menghitung margin, container cukup memakai justify-content: space-between yang kita hitung pada Chapter Justify Content
— seluruh ruang sisa ditempatkan di antara kedua gugus. File berikut dipakai oleh demo chapter ini:
/* Pola 1: navbar space-between */
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 16px;
background: rgb(15, 23, 42);
color: rgb(255, 255, 255);
}
.merek { font-weight: 700; }
.menu {
display: flex;
gap: 16px;
list-style: none;
margin: 0;
padding: 0;
}
/* Pola 2: perfect centering */
.hero {
display: flex;
align-items: center;
justify-content: center;
height: 200px;
background: rgb(241, 245, 249);
}
.kotak-sapa {
padding: 24px 32px;
background: rgb(14, 165, 233);
color: rgb(255, 255, 255);
font-weight: 700;
}
/* Pola 3: media object */
.media {
display: flex;
gap: 12px;
width: 420px;
}
.avatar {
width: 48px;
height: 48px;
border-radius: 999px;
background: rgb(94, 234, 212);
flex-shrink: 0; /* avatar tidak ikut menyusut */
}
.media-body { flex: 1; min-width: 0; }
.media-judul { font-weight: 700; margin-bottom: 4px; }
/* Pola 4: kartu dengan footer terdorong */
.kartu {
display: flex;
flex-direction: column;
width: 260px;
height: 190px;
border: 1px solid rgb(226, 232, 240);
background: rgb(255, 255, 255);
}
.isi-kartu { flex: 1; padding: 16px; }
.kaki-kartu {
display: flex;
padding: 12px 16px;
border-top: 1px solid rgb(226, 232, 240);
}
.tombol-polos { color: rgb(71, 85, 105); }
.tombol-utama {
margin-left: auto; /* didorong ke ujung kanan */
padding: 6px 14px;
background: rgb(14, 165, 233);
color: rgb(255, 255, 255);
border-radius: 6px;
font-weight: 700;
}Mari kita telaah keputusan desain di balik aturan-aturan di atas:
.navbar(space-between + align-items center): brand dan menu menjadi dua flex items; ruang sisa seluruhnya di antara keduanya, sementara align-items merapatkan tinggi keduanya di cross axis..menu(flex + gap): deretan tautan disusun berjajar dengan jarak seragam 16px — flexbox bersarang di dalam flexbox..hero(align-items center + justify-content center): penjajaran kedua sumbu sekaligus; apa pun ukuran kotak sapaan, posisinya tepat di tengah — pola yang sering disebut perfect centering..media+.avatar(flex-shrink: 0): gambar bulat tidak boleh gepeng saat teks panjang, sehingga shrink-nya dinolkan; body teks justru yang menyerap penyusutan berkatflex: 1danmin-width: 0..kartu(column + isi flex: 1): isi kartu direnggangkan hingga footer terdorong ke dasar, apa pun panjang teksnya..tombol-utama(margin-left: auto): di dalam footer yang juga flex, margin auto menyerap seluruh ruang sisa di kirinya sehingga tombol menempel ke kanan — pasangan alami dari space-between ketika items lebih dari dua gugus.
HTML pendampingnya menyusun keempat pola bertumpuk:
<div class="hero">
<div class="kotak-sapa">Halo, flexbox</div>
</div>
<div class="kartu">
<div class="isi-kartu">
<p>Ringkasan artikel singkat di dalam kartu.</p>
</div>
<div class="kaki-kartu">
<span class="tombol-polos">Bagikan</span>
<span class="tombol-utama">Baca</span>
</div>
</div>Hasil di Browser:
Navbar: brand menempel di kiri, tiga tautan menu di kanan dengan jarak 16px
(computed display flex, justify-content space-between).
Hero setinggi 200px: kotak sapaan berada tepat di tengah, vertikal dan
horizontal (computed align-items center, justify-content center).
Media object: avatar 48px di kiri, teks mengisi sisa ruang (display flex).
Kartu setinggi 190px: computed display flex dengan flex-direction column,
isi kartu direnggangkan berkat flex-grow 1 sehingga footer menempel di dasar
dan tombol Baca menempel di ujung kanan footer berkat margin-left auto.Sticky Footer Singkat #
Pola kelima menuntaskan masalah klasik: footer yang menempel di dasar viewport pada halaman pendek, namun tetap mengalir setelah konten pada halaman panjang. Resepnya memakai flex arah kolom dengan tinggi minimal satu viewport:
.halaman {
display: flex;
flex-direction: column;
min-height: 100vh; /* fallback browser lama */
min-height: 100dvh; /* tinggi dinamis perangkat, Baseline 2023 */
}
.kaki-halaman { margin-top: auto; }margin-top: auto pada footer bekerja dengan prinsip yang sama seperti tombol Baca di kartu: ruang sisa di main axis diserap margin, sehingga footer terdorong ke ujung bawah. Unit dvh menangani perangkat dengan bilah URL yang menyembunyikan sebagian tinggi layar; deklarasi 100vh di atasnya tetap dipertahankan sebagai fallback karena fitur ini Baseline 2023.
Section Flexbox sampai di sini telah membangun fondasi layout satu dimensi secara utuh. Untuk layout dua dimensi — baris dan kolom sekaligus dalam satu container — lanjutkan ke Section Grid .
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh-pola-layout.css
Unduh berkas/* Pola 1: navbar space-between */
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 16px;
background: rgb(15, 23, 42);
color: rgb(255, 255, 255);
}
.merek { font-weight: 700; }
.menu {
display: flex;
gap: 16px;
list-style: none;
margin: 0;
padding: 0;
}
/* Pola 2: perfect centering */
.hero {
display: flex;
align-items: center;
justify-content: center;
height: 200px;
background: rgb(241, 245, 249);
}
.kotak-sapa {
padding: 24px 32px;
background: rgb(14, 165, 233);
color: rgb(255, 255, 255);
font-weight: 700;
}
/* Pola 3: media object */
.media {
display: flex;
gap: 12px;
width: 420px;
}
.avatar {
width: 48px;
height: 48px;
border-radius: 999px;
background: rgb(94, 234, 212);
flex-shrink: 0; /* avatar tidak ikut menyusut */
}
.media-body { flex: 1; min-width: 0; }
.media-judul { font-weight: 700; margin-bottom: 4px; }
/* Pola 4: kartu dengan footer terdorong */
.kartu {
display: flex;
flex-direction: column;
width: 260px;
height: 190px;
border: 1px solid rgb(226, 232, 240);
background: rgb(255, 255, 255);
}
.isi-kartu { flex: 1; padding: 16px; }
.kaki-kartu {
display: flex;
padding: 12px 16px;
border-top: 1px solid rgb(226, 232, 240);
}
.tombol-polos { color: rgb(71, 85, 105); }
.tombol-utama {
margin-left: auto; /* didorong ke ujung kanan */
padding: 6px 14px;
background: rgb(14, 165, 233);
color: rgb(255, 255, 255);
border-radius: 6px;
font-weight: 700;
}