1546 kata
8 menit

Belajar CSS Flexbox: Biar Layout Web Nggak Berantakan

Pernah mencoba menaruh dua elemen berdampingan, tetapi hasilnya malah bertumpuk ke bawah?

Misalnya, kita ingin membuat halaman profil. Di sebelah kiri ada foto, sementara di sebelah kanan ada nama dan deskripsi singkat.

Kelihatannya sederhana. Tetapi kalau kita hanya mengandalkan HTML dan CSS dasar, hasilnya belum tentu sesuai harapan.

Nah, di sinilah Flexbox mulai berguna.

Halo, Gabuters! Kali ini kita akan belajar bagaimana CSS membantu mengatur posisi elemen agar layout halaman lebih rapi.

Tenang, kita tidak perlu menghafal semua properti Flexbox sekaligus. Kita pahami dulu cara kerjanya, lalu mencoba satu per satu.

Kenapa Kita Membutuhkan Flexbox?#

Perhatikan HTML berikut:

<div class="profil">
<img src="foto-profil.jpg" alt="Foto profil BapakGabut">
<div>
<h2>BapakGabut</h2>
<p>Ngoding, main game, dan ngulik apa saja.</p>
</div>
</div>

Secara default, elemen <div> merupakan elemen block. Artinya, elemen tersebut biasanya mengambil ruang selebar area yang tersedia dan dimulai pada baris baru.

Karena itu, bagian informasi profil cenderung muncul di bawah foto, bukan otomatis di sebelahnya.

Padahal yang kita inginkan kira-kira seperti ini:

+-------------------------------+
| PROFIL |
| |
| +--------+ BapakGabut |
| | FOTO | Ngoding, main |
| | | game, dan ngulik |
| +--------+ apa saja. |
+-------------------------------+

Kita bisa menggunakan berbagai teknik CSS untuk membuat layout tersebut, tetapi Flexbox menawarkan cara yang lebih praktis untuk menyusun dan meratakan elemen dalam satu arah.

Mengenal Flex Container dan Flex Item#

Flexbox adalah sistem layout CSS untuk mengatur elemen dalam satu dimensi: baris atau kolom.

Ada dua istilah yang perlu kita pahami:

  • Flex container: elemen induk yang diberi display: flex.
  • Flex item: elemen anak langsung dari flex container.

Contohnya:

<div class="kotak-induk">
<div class="kotak">A</div>
<div class="kotak">B</div>
<div class="kotak">C</div>
</div>
.kotak-induk {
display: flex;
}

Begitu display: flex diterapkan, ketiga kotak menjadi flex item dan secara default disusun dalam satu baris.

Perlu diperhatikan bahwa hanya anak langsung yang menjadi flex item. Elemen yang berada lebih dalam tidak otomatis menjadi flex item dari container tersebut.

Memahami Main Axis dan Cross Axis#

Sebelum mencoba berbagai properti, kita perlu memahami dua arah penting dalam Flexbox.

Main axis adalah sumbu utama tempat flex item disusun.

Cross axis adalah sumbu yang tegak lurus terhadap main axis.

Jika menggunakan flex-direction: row, main axis biasanya berjalan secara horizontal, sedangkan cross axis vertikal.

Jika menggunakan flex-direction: column, main axis berjalan secara vertikal, sedangkan cross axis horizontal.

Arah awal dan akhir sumbu juga dipengaruhi oleh arah penulisan halaman. Jadi, main axis tidak selalu berarti kiri ke kanan.

Kenapa ini penting?

Karena nantinya justify-content bekerja pada main axis, sedangkan align-items bekerja pada cross axis.

1. display: flex — Mengaktifkan Flexbox#

Mari mulai dari contoh sederhana.

<div class="container">
<div class="item">HTML</div>
<div class="item">CSS</div>
<div class="item">JavaScript</div>
</div>
.container {
display: flex;
border: 2px solid #333;
padding: 12px;
}
.item {
background-color: #dbeafe;
border: 1px solid #60a5fa;
padding: 12px;
}

Hasilnya, ketiga item akan disusun berdampingan dalam satu baris selama ruangnya memungkinkan.

Tanpa display: flex, ketiga <div> biasanya tersusun secara vertikal karena perilaku block masing-masing.

Coba hapus display: flex, perhatikan perubahannya, kemudian pasang kembali.

Eksperimen sederhana ini membantu kita memahami apa yang sebenarnya dilakukan Flexbox.

2. flex-direction — Menentukan Arah Susunan#

Secara default, Flexbox menggunakan:

.container {
display: flex;
flex-direction: row;
}

Artinya, item disusun dalam satu baris mengikuti main axis.

Jika kita ingin item tersusun dari atas ke bawah, gunakan:

.container {
display: flex;
flex-direction: column;
}

Nilai lain yang tersedia adalah row-reverse dan column-reverse.

Namun, untuk tahap awal, cukup pahami row dan column terlebih dahulu.

Satu hal penting: mengubah urutan visual dengan CSS tidak otomatis mengubah urutan elemen pada HTML. Karena itu, tetap susun HTML dalam urutan yang masuk akal untuk pembaca dan pengguna keyboard.

3. justify-content — Mengatur Posisi pada Main Axis#

Bayangkan kita memiliki tiga kotak di dalam container yang cukup lebar.

Secara default, kotak-kotak tersebut berkumpul di bagian awal main axis.

Dengan justify-content, kita bisa mengatur bagaimana ruang yang tersedia dibagikan pada sumbu utama.

Contoh:

.container {
display: flex;
justify-content: center;
}

Ketiga kotak akan berkumpul di tengah main axis.

Beberapa nilai yang sering digunakan:

NilaiFungsi
flex-startMenempatkan item di awal main axis
centerMenempatkan item di tengah
flex-endMenempatkan item di akhir main axis
space-betweenMembagikan ruang di antara item, tanpa ruang tambahan di kedua ujung
space-aroundMembagikan ruang di sekitar setiap item
space-evenlyMembuat jarak antarkotak dan tepi container sama besar

Contohnya:

.container {
display: flex;
justify-content: space-between;
}

Properti ini akan lebih mudah diamati ketika container memiliki ruang kosong yang cukup pada main axis.

4. align-items — Mengatur Posisi pada Cross Axis#

Kalau justify-content bekerja pada main axis, align-items bekerja pada cross axis.

Misalnya:

.container {
display: flex;
height: 180px;
align-items: center;
}

Dengan flex-direction: row, item akan diratakan di tengah secara vertikal.

Nilai yang umum digunakan:

  • stretch: item direntangkan pada cross axis jika ukurannya memungkinkan.
  • flex-start: item berada di awal cross axis.
  • center: item berada di tengah cross axis.
  • flex-end: item berada di akhir cross axis.

Sekarang coba gabungkan:

.container {
display: flex;
justify-content: center;
align-items: center;
height: 180px;
}

Jika arah Flexbox masih row, item akan berada di tengah secara horizontal dan vertikal.

Catatan: Jika kita mengubah flex-direction menjadi column, arah kerja kedua properti tersebut ikut berubah.

Inilah alasan kita perlu memahami main axis dan cross axis, bukan sekadar menghafal bahwa justify-content itu horizontal dan align-items itu vertikal.

5. gap — Memberikan Jarak Antarelemen#

Ketika item sudah berdampingan, biasanya kita ingin memberikan jarak yang konsisten.

Kita bisa menggunakan gap.

.container {
display: flex;
gap: 16px;
}

Hasilnya, terdapat jarak 16 piksel di antara flex item.

Keuntungan gap adalah kita tidak perlu memberikan margin pada setiap item hanya untuk membuat jarak antarelemen.

Perlu diingat, gap mengatur jarak di antara item, bukan padding pada tepi container.

Jika kita ingin memberi ruang antara isi dan batas container, gunakan padding, seperti yang sudah kita pelajari pada artikel Box Model.

6. flex-wrap — Ketika Ruang Tidak Cukup#

Sekarang bayangkan kita mempunyai banyak kartu yang disusun menggunakan Flexbox.

<div class="daftar-kartu">
<div class="kartu">HTML</div>
<div class="kartu">CSS</div>
<div class="kartu">JavaScript</div>
<div class="kartu">Node.js</div>
</div>
.daftar-kartu {
display: flex;
gap: 12px;
}
.kartu {
width: 140px;
padding: 16px;
background-color: #e0f2fe;
}

Secara default, Flexbox menggunakan flex-wrap: nowrap.

Artinya, item berusaha tetap berada dalam satu baris. Ukurannya bisa menyusut ketika ruang tidak cukup.

Untuk mengizinkan item berpindah ke baris berikutnya, tambahkan:

.daftar-kartu {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.kartu {
flex: 0 0 140px;
padding: 16px;
background-color: #e0f2fe;
}

Dengan contoh ini, setiap kartu mempertahankan lebar dasar 140 piksel dan dapat berpindah ke baris berikutnya jika ruang tidak mencukupi.

Ini berguna untuk membuat kumpulan kartu, daftar menu, atau elemen lain yang jumlahnya bisa bertambah.

Namun, flex-wrap saja belum tentu cukup untuk membuat seluruh halaman nyaman di layar kecil. Kita akan membahas hal tersebut lebih lanjut pada artikel Responsive.

7. Praktik: Membuat Layout Profil BapakGabut#

Sekarang kita terapkan Flexbox pada contoh yang lebih nyata.

Kita akan membuat kartu profil dengan foto di sebelah kiri dan informasi di sebelah kanan.

HTML#

<div class="kartu-profil">
<img
src="foto-profil.jpg"
alt="Foto profil BapakGabut"
class="foto-profil"
>
<div class="informasi-profil">
<h2>BapakGabut</h2>
<p>Ngoding, main game, dan ngulik apa saja.</p>
<a href="#">Lihat Artikel</a>
</div>
</div>

Ganti foto-profil.jpg dengan lokasi gambar yang tersedia pada proyek latihanmu. Tautan # juga masih merupakan placeholder yang perlu diganti jika halaman ini digunakan sebagai situs sungguhan.

CSS#

* {
box-sizing: border-box;
}
.kartu-profil {
display: flex;
align-items: center;
gap: 24px;
max-width: 650px;
padding: 24px;
margin: 32px auto;
border: 1px solid #d1d5db;
border-radius: 12px;
background-color: #f8fafc;
}
.foto-profil {
width: 120px;
height: 120px;
flex-shrink: 0;
object-fit: cover;
border-radius: 50%;
}
.informasi-profil {
min-width: 0;
}
.informasi-profil h2 {
margin-top: 0;
}
.informasi-profil p {
line-height: 1.6;
}

Mari kita bahas bagian pentingnya.

display: flex membuat foto dan informasi profil menjadi dua flex item yang berdampingan.

align-items: center membantu meratakan keduanya pada bagian tengah cross axis.

gap: 24px memberikan jarak antara foto dan informasi.

flex-shrink: 0 menjaga foto agar tidak menyusut ketika Flexbox membagikan ruang.

object-fit: cover membantu gambar mengisi ukuran foto yang telah ditentukan tanpa merusak perbandingan aspeknya, meskipun sebagian gambar dapat terpotong.

max-width: 650px membatasi lebar kartu agar tidak terus melebar pada layar besar.

margin: 32px auto memberikan margin atas dan bawah, sekaligus memusatkan kartu secara horizontal ketika tersedia ruang.

Perhatikan bahwa tidak semua properti dalam contoh ini merupakan properti khusus Flexbox. Kita tetap menggabungkan Flexbox dengan Box Model dan CSS lainnya.

Itulah yang akan sering kita lakukan ketika membangun halaman sungguhan.

8. Kesalahan Umum Saat Belajar Flexbox#

Menggunakan justify-content untuk semua arah#

Kadang kita menulis:

.container {
display: flex;
justify-content: center;
}

Lalu bingung mengapa item belum berada di tengah secara vertikal.

Penyebabnya, justify-content hanya bekerja pada main axis.

Jika ingin mengatur cross axis, gunakan align-items.

Memberikan display: flex pada elemen yang salah#

Misalnya, kita ingin membuat foto dan informasi profil berdampingan, tetapi justru memberikan display: flex pada elemen foto.

Padahal yang perlu menjadi flex container adalah elemen induk yang membungkus keduanya.

Ingat: Flexbox mengatur anak langsung dari container.

Menganggap Flexbox otomatis menyelesaikan semua masalah responsive#

Flexbox memang membantu mengatur susunan elemen, tetapi layout yang nyaman pada desktop belum tentu nyaman pada ponsel.

Kartu profil dengan foto dan informasi berdampingan, misalnya, mungkin lebih baik disusun vertikal pada layar sempit.

Kita akan mempelajari cara mengaturnya menggunakan media query pada artikel berikutnya.

Tidak memperhitungkan ukuran konten#

Teks panjang, gambar besar, dan item dengan ukuran minimum tertentu dapat membuat layout melebar atau meluap.

Jika hasilnya tidak sesuai harapan, periksa juga width, min-width, flex-shrink, dan ukuran elemen lainnya.

Flexbox bukan berarti kita bisa mengabaikan ukuran konten.

9. Latihan Mandiri#

Sekarang giliran Gabuters mencoba.

Gunakan kartu profil tadi, lalu lakukan beberapa perubahan berikut:

  1. Ubah flex-direction dari row menjadi column. Perhatikan perubahan susunannya.
  2. Coba justify-content: center dan justify-content: space-between pada container yang memiliki ruang kosong.
  3. Ubah nilai gap menjadi 8px, 16px, dan 32px.
  4. Tambahkan beberapa kartu baru dan gunakan flex-wrap: wrap.
  5. Coba perbesar dan perkecil jendela browser. Amati kapan susunan elemen mulai terasa kurang nyaman.

Tidak masalah kalau hasilnya belum sempurna.

Justru dengan mencoba mengubah properti satu per satu, kita bisa memahami hubungan antara aturan CSS dan tampilan di browser.

10. Selanjutnya: CSS Responsive#

Sekarang kita sudah tahu cara menyusun elemen dengan Flexbox.

Tetapi muncul pertanyaan baru.

Bagaimana jika kartu profil yang terlihat bagus pada laptop ternyata terlalu sempit ketika dibuka melalui ponsel?

Apakah kita perlu membuat dua halaman HTML yang berbeda?

Untungnya tidak.

Pada artikel berikutnya, kita akan belajar CSS Responsive, termasuk media query, supaya tampilan halaman bisa menyesuaikan ukuran layar.

Sampai jumpa di pembahasan berikutnya, Gabuters!

CSS

Selesai

Bagian 4 dari 6Tulisan ini bagian dari seri

Bagikan Artikel

Buat poster berbagi atau salin tautan artikel ini.

Lanjut membaca

Bacaan terkait

Berdasarkan tag dan kategori yang sama

Coba jalur lain

Pilihan konsisten dari artikel lain