Setelah mempelajari positioning dan z-index, sekarang saatnya mengenal Flexbox (Flexible Box Layout) - salah satu alat paling powerful dalam CSS modern untuk membuat layout. Flexbox menyederhanakan pembuatan layout yang responsif, fleksibel, dan mudah diatur, baik untuk komponen kecil maupun struktur halaman secara keseluruhan.
Apa Itu Flexbox?
Flexbox adalah model layout satu dimensi (baris ATAU kolom) yang memungkinkan kita mengatur ruang dan posisi elemen di dalam container secara fleksibel. Keunggulan Flexbox:
- Membuat elemen rata tengah dengan mudah (horizontal & vertikal).
- Mengatur jarak antar elemen secara otomatis.
- Membuat navbar responsif dengan logo kiri dan menu kanan.
- Mengubah urutan elemen tanpa mengubah HTML.
- Membuat kolom dengan tinggi yang sama secara otomatis.
1. Flex Container (induk) → elemen yang diberi
display: flex atau display: inline-flex.
2. Flex Item (anak) → elemen langsung di dalam flex container.
1. Dasar Flexbox
Untuk memulai Flexbox, cukup tambahkan display: flex ke container. Secara default, semua item akan berjajar horizontal (satu baris) dan memiliki tinggi yang sama.
Contoh: Tanpa Flex vs Dengan Flex
<style>
.tanpa-flex { background: #f0f4f8; padding: 10px; }
.tanpa-flex div { background: #3b82f6; color: white; padding: 15px; margin: 5px; }
.dengan-flex { background: #f0f4f8; padding: 10px; display: flex; }
.dengan-flex div { background: #22c55e; color: white; padding: 15px; margin: 5px; }
</style>
<div class="tanpa-flex">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
<div class="dengan-flex">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
Tanpa Flexbox (block → vertikal)
Dengan Flexbox (horizontal berjajar)
2. Sumbu dalam Flexbox (Main Axis & Cross Axis)
Flexbox memiliki dua sumbu:
- Main Axis (sumbu utama) → arah utama pergerakan item. Default: horizontal (kiri ke kanan).
- Cross Axis (sumbu silang) → tegak lurus terhadap main axis. Default: vertikal (atas ke bawah).
Main Axis: ←→ (horizontal)
Cross Axis: ↑↓ (vertikal)
3. flex-direction (Mengatur Arah Sumbu Utama)
Properti flex-direction menentukan arah main axis (sumbu utama). Nilai yang tersedia:
| Nilai | Arah Main Axis | Contoh |
|---|---|---|
row (default) |
Horizontal kiri → kanan | 1 2 3 |
row-reverse |
Horizontal kanan → kiri | 3 2 1 |
column |
Vertikal atas → bawah | 1 2 3 (vertikal) |
column-reverse |
Vertikal bawah → atas | 3 2 1 (vertikal) |
Contoh flex-direction:
<style>
.flex-container {
display: flex;
background: #f0f4f8;
padding: 10px;
margin-bottom: 15px;
}
.flex-container div {
background: #3b82f6;
color: white;
padding: 15px;
margin: 5px;
border-radius: 5px;
}
.row { flex-direction: row; }
.row-reverse { flex-direction: row-reverse; }
.column { flex-direction: column; }
.column-reverse { flex-direction: column-reverse; }
</style>
<div class="flex-container row">
<div>1</div><div>2</div><div>3</div>
</div>
<div class="flex-container row-reverse">
<div>1</div><div>2</div><div>3</div>
</div>
<div class="flex-container column">
<div>1</div><div>2</div><div>3</div>
</div>
<div class="flex-container column-reverse">
<div>1</div><div>2</div><div>3</div>
</div>
row (default): kiri → kanan
row-reverse: kanan → kiri
column: atas → bawah
column-reverse: bawah → atas
Contoh Proyek: Navbar Responsif dengan Flexbox
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flexbox - Navbar Responsif</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: #f0f4f8;
}
/* Navbar dengan Flexbox */
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
background: #1e293b;
color: white;
padding: 15px 40px;
flex-wrap: wrap;
}
.logo {
font-size: 24px;
font-weight: bold;
}
.nav-links {
display: flex;
list-style: none;
gap: 30px;
}
.nav-links a {
color: white;
text-decoration: none;
transition: color 0.3s;
}
.nav-links a:hover {
color: #3b82f6;
}
/* Demo section */
.container {
max-width: 1000px;
margin: 40px auto;
background: white;
border-radius: 20px;
padding: 30px;
}
h1 {
text-align: center;
margin-bottom: 20px;
}
/* Flex demo card */
.flex-demo {
display: flex;
flex-direction: row;
gap: 20px;
margin: 20px 0;
flex-wrap: wrap;
}
.demo-card {
background: #eef2ff;
padding: 20px;
border-radius: 12px;
flex: 1;
min-width: 150px;
}
.demo-card h3 {
margin-bottom: 10px;
}
/* Media query untuk responsive navbar */
@media (max-width: 768px) {
.navbar {
flex-direction: column;
gap: 15px;
text-align: center;
}
.nav-links {
flex-direction: column;
gap: 10px;
}
}
.info-box {
background: #eef2ff;
padding: 20px;
border-radius: 12px;
margin-top: 30px;
}
.info-box code {
background: #e2e8f0;
padding: 2px 6px;
border-radius: 4px;
font-family: monospace;
}
</style>
</head>
<body>
<nav class="navbar">
<div class="logo">MyBrand</div>
<ul class="nav-links">
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<div class="container">
<h1>Belajar Flexbox - Dasar</h1>
<div class="flex-demo">
<div class="demo-card">
<h3>Flex Container</h3>
<p>Elemen dengan <code>display: flex</code>. Mengatur arah, perataan, dan jarak item.</p>
</div>
<div class="demo-card">
<h3>Flex Item</h3>
<p>Anak langsung dari flex container. Bisa diatur order, grow, shrink, dll.</p>
</div>
<div class="demo-card">
<h3>Main Axis & Cross Axis</h3>
<p>Sumbu utama (main axis) ditentukan oleh <code>flex-direction</code>.</p>
</div>
</div>
<div class="info-box">
<h3>Ringkasan Flexbox Dasar</h3>
<ul>
<li><code>display: flex</code> → mengaktifkan flexbox pada container.</li>
<li><code>flex-direction</code> → mengatur arah sumbu utama (row, column, row-reverse, column-reverse).</li>
<li><code>flex-wrap</code> → mengatur apakah item boleh pindah baris/kolom.</li>
<li>Flexbox memudahkan layout responsif, navbar, card grid, dan perataan elemen.</li>
</ul>
</div>
</div>
</body>
</html>
Hasil visual navbar:
Kesalahan Umum Pemula
- Lupa menambahkan
display: flexpada container → Properti flex lainnya tidak akan berfungsi. - Mengira
flex-directionmengubah urutan item → Ya, tapi hanya tampilan, bukan urutan di DOM. - Tidak memahami perbedaan main axis dan cross axis → Penting untuk perataan dengan justify-content (main axis) dan align-items (cross axis).
- Menggunakan
flex-direction: columntetapi lupa mengatur tinggi container → Item bisa keluar dari batas.
- Buka Developer Tools (F12) → inspect flex container → di tab Styles, cari properti flex.
- Gunakan Flexbox Inspector di Firefox (sangat membantu memvisualisasikan sumbu).
- Berikan border/warna sementara pada flex container dan item untuk melihat batas.
Latihan Singkat
- Buat flex container dengan 4 item, atur flex-direction: row, row-reverse, column, column-reverse. Amati perubahannya.
- Buat navbar dengan logo di kiri dan menu di kanan menggunakan flexbox.
- Buat galeri 3 kartu dalam satu baris menggunakan flexbox.
- Buat container dengan flex-direction: column dan beri tinggi 300px, amati bagaimana item disusun.
Intisari Hari Ini
- Flexbox adalah model layout satu dimensi untuk mengatur ruang dan posisi elemen.
display: flex→ mengaktifkan flexbox pada container.flex-direction→ mengatur arah sumbu utama (row, row-reverse, column, column-reverse).- Main axis adalah arah utama (default horizontal), cross axis tegak lurus.
- Flexbox sangat berguna untuk navbar, card grid, form layout, dan pemusatan elemen.
- Selanjutnya akan dipelajari properti untuk mengatur perataan:
justify-contentdanalign-items.
- Header dengan logo (kiri) dan navigasi (kanan) menggunakan flex.
- Galeri karya minimal 4 kartu dalam satu baris (flex-wrap: wrap).
- Footer dengan 3 kolom informasi (tentang, kontak, sosial media) dalam satu baris flex.
- Gunakan
flex-direction: rowuntuk desktop, dan media query untuk mengubah kecolumndi HP. - Tambahkan efek hover pada kartu (scale, shadow).
- Buat kotak penjelasan tentang properti flex yang dipakai.
Selamat mencoba!
Artikel Sebelumnya: CSS Dasar #22 - Z-Index: Mengatur Tumpukan Elemen
Artikel Selanjutnya: CSS Dasar #24 - justify-content: flex-start, flex-end, center, space-between, space-around, space-evenly
