Memahami penggunaan CSS Flexbox

CSS Flexbox adalah model tata letak web yang dirancang untuk konten satu dimensi (disusun dalam bentuk baris atau kolom). Model tata letak ini menurut saya perlu dikuasai karena sudah cukup menyelesaikan persoalan desain web yang umum.
Setidaknya ada 14 property yang termasuk ke dalam CSS Flexbox. Omong-omong, artikel ini mengambil referensi dari dua artikel yang ditulis oleh CSS-Tricks berjudul A Complete Guide to Flexbox dan Understanding flex-grow, flex-shrink, and flex-basis, sehingga saya sangat menyarankan kamu untuk membacanya juga nanti.
Sebelum mulai, berikut saya lampirkan kode latihan jika kamu ingin sambil mempraktikkannya:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS Flexbox | divClassId</title>
<link rel="stylesheet" href="./style.css">
</head>
<body>
<main>
<!-- 1. Property display: flex -->
<div class="container display">
<article class="card">
<p>HTML adalah bahasa <em>markup</em> yang digunakan untuk menyusun struktur web.</p>
</article>
<article class="card">
<p>CSS adalah bahasa <em>stylesheet</em> yang digunakan untuk mengatur tampilan atau visual web.</p>
</article>
<article class="card">
<p>JavaScript adalah bahasa pemrograman yang digunakan pada web agar bisa tampil dinamis dan interaktif.</p>
</article>
</div>
<!-- 2. Property flex-direction -->
<div class="container flex-direction">
</div>
<!-- 3. Property flex-wrap -->
<div class="container flex-wrap">
</div>
<!-- 4. Property flex-flow -->
<div class="container flex-flow">
</div>
<!-- 5. Property justify-content -->
<div class="container justify-content">
</div>
<!-- 6. Property align-items -->
<div class="container align-items">
</div>
<!-- 7. Property align-content -->
<div class="container align-content">
</div>
<!-- 8. Property gap -->
<div class="container gap">
</div>
<!-- 9. Property order -->
<div class="container order">
</div>
<!-- 10. Property align-self -->
<div class="container align-self">
</div>
<!-- 11. Property flex-grow -->
<div class="container flex-grow">
</div>
<!-- 12. Property flex-shrink -->
<div class="container flex-shrink">
</div>
<!-- 13. Property flex-basis -->
<div class="container flex-basis">
</div>
<!-- 14. Property flex -->
<div class="container flex">
</div>
</main>
</body>
</html>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
:root {
--color-black: #111111;
--color-dark-green: #0b6758;
--color-light-green: #0d7968;
--color-white: #fcfcfc;
}
html {
height: 100%;
}
body {
background-color: var(--color-black);
font-family: sans-serif;
height: 100%;
line-height: 1.5;
}
.container {
padding: 10px;
}
.container:nth-child(odd) {
background-color: var(--color-dark-green);
}
.container:nth-child(even) {
background-color: var(--color-light-green);
}
.card {
background-color: var(--color-white);
border-radius: 10px;
color: var(--color-black);
margin: 10px;
padding: 20px;
width: calc(25% - 20px);
}
/* 1. Property display: flex */
/* 2. Property flex-direction */
/* 3. Property flex-wrap */
/* 4. Property flex-flow */
/* 5. Property justify-content */
/* 6. Property align-items */
/* 7. Property align-content */
/* 8. Property gap */
/* 9. Property order */
/* 10. Property flex-grow */
/* 11. Property flex-grow */
/* 12. Property flex-shrink */
/* 13. Property flex-basis */
/* 14. Property flex */
Berikut penjelasan untuk setiap property CSS Flexbox:
1. Property display: flex
Jika kita langsung menjalankan latihan di atas tentu tampilan card akan tersusun ke bawah karena efek dari property display: block bawaan elemen <article>. Namun, jika kita tambahkan display: flex pada elemen container-nya, maka card sekarang akan tersusun ke samping.
/* 1. Property display: flex */
.display {
display: flex;
}

Ini adalah cara mengaktifkan CSS Flexbox pada suatu elemen HTML. Bisa dilihat pula bahwa CSS Flexbox mengambil alih penerapan tata letak pada elemen-elemen di dalam container, termasuk jika di dalamnya ada elemen yang memiliki nilai inline pada property display-nya (seperti <span>).
2. Property flex-direction
Ketika menambahkan display: flex pada elemen container semua elemen di dalamnya akan otomatis ditampilkan dalam bentuk baris. Apakah ini murni efek yang dibawa property tersebut? Jawabannya, tentu tidak.
Ketika property tersebut ditambahkan, dibalik layar secara otomatis beberapa property juga ikut ditambahkan, salah satunya adalah flex-direction. Property ini memiliki nilai bawaan row yang menyebabkan card tersusun ke samping.
Beberapa nilai lain yang bisa kita gunakan, yaitu:
column: Nilai ini akan menampilkan susunan card dalam bentuk kolom dari atas ke bawah.row-reverse: Serupa dengan nilairow, tapi akan ditampilkan dari kanan ke kiri.column-reverse: Serupa dengan nilaicolumn, tapi akan ditampilkan dari bawah ke atas.
/* 2. Property flex-direction */
.flex-direction {
display: flex;
flex-direction: column;
}

3. Property flex-wrap
Kalau kamu coba menambahkan beberapa card lagi, kamu akan melihat semua card ditampilkan dalam satu baris yang sama dan ukuran lebarnya menjadi lebih kecil dari yang seharusnya. Ini terjadi karena CSS Flexbox memang hanya dirancang untuk konten satu dimensi saja.
Untuk mengatasinya, kita perlu mengubah nilai bawaan flex-wrap dari nowrap menjadi wrap. Dengan begitu, ketika beberapa card sudah memenuhi lebar dari elemen container, maka card lainnya akan tampil di bawahnya, tapi masih dalam satu kelompok baris yang sama.
/* 3. Property flex-wrap */
.flex-wrap {
display: flex;
flex-wrap: wrap;
}

Ada juga nilai wrap-reverse yang serupa dengan nilai wrap, tapi akan ditampilkan sebaliknya.
4. Property flex-flow
flex-flow adalah shorthand atau penulisan ringkas dari flex-direction dan flex-wrap dengan nilai bawaannya adalah row nowrap.
/* 4. Property flex-flow */
.flex-flow {
display: flex;
flex-flow: column wrap;
/* Tambahan agar efeknya terlihat */
height: 300px;
}

5. Property justify-content
justify-content akan mengatur bagaimana susunan card ditampilkan di dalam baris jika ada ruang yang tersisa. Beberapa nilai yang perlu diketahui, antara lain:
flex-start(default): Nilai ini akan menampilkannya di awal berdasarkan nilai dariflex-direction. Jika nilainya tidak diubah, maka susunan card akan tampil di kiri.flex-end: Nilai ini akan menampilkannya di akhir berdasarkan nilai dariflex-direction. Jika nilainya tidak diubah, maka akan tampil di kanan.center: Nilai ini akan menampilkannya tepat di tengah.space-between: Nilai ini akan menampilkan card pertama di awal dan card terakhir di akhir baris, lalu membagi ruang yang tersisa untuk card-card di antara keduanya.space-around: Nilai ini akan membagi rata ruang yang tersisa terlebih dahulu kepada setiap card. Itu sebabnya ruang pada sisi card awal dan card akhir yang berbatasan tepi tidak sama dengan ruang antara card, karena ruang antara card merupakan gabungan dua ruang.space-evenly: Nilai ini akan membagi rata ruang yang tersisa baik antara sesama card maupun antara card dan tepinya.
/* 5. Property justify-content */
.justify-content {
display: flex;
justify-content: space-evenly;
}

6. Property align-items
Sejak awal kamu pasti sudah menyadari bahwa terdapat ruang kosong pada card pertama dan kedua. Ini terjadi karena teks pada card ketiga cukup panjang sehingga tinggi card pertama dan kedua meregang mengikuti tinggi card ketiga.
Bukan hanya itu, jika kita menetapkan property height pada elemen container, maka ruang kosong bisa saja terjadi di semua card agar tingginya dapat memenuhi tinggi container-nya. Efek ini disebabkan oleh align-items yang nilai bawaannya adalah stretch.
Beberapa nilai yang bisa kita gunakan untuk menghilangkan efek tersebut, antara lain:
flex-start: Nilai ini akan menempatkan card pada batas atas dari card lain yang lebih tinggi.flex-end: Nilai ini akan menempatkan card pada batas bawahnya.center: Nilai ini akan menempatkan card di tengahnya.
/* 6. Property align-items */
.align-items {
align-items: center;
display: flex;
}

7. Property align-content
align-content serupa dengan justify-content. Bedanya, ini berlaku vertikal dan hanya bisa digunakan ketika elemen container menetapkan height dan flex-wrap dengan nilai selain nowrap.
Beberapa nilai yang perlu diketahui, antara lain:
stretch(default): Nilai ini akan meregangkan tinggi card agar memenuhi tinggi elemen container.flex-start: Nilai ini akan menampilkannya di awal berdasarkan nilai dariflex-direction. Jika nilainya tidak diubah, maka susunan card akan tampil di atas.flex-end: Nilai ini akan menampilkannya di akhir berdasarkan nilai dariflex-direction. Jika nilainya tidak diubah, maka akan tampil di bawah.center: Nilai ini akan menampilkannya tepat di tengah.space-between: Nilai ini akan menampilkan baris card pertama di awal dan baris card terakhir di akhir, lalu membagi ruang yang tersisa untuk baris-baris card di antara keduanya.space-around: Nilai ini akan membagi rata ruang yang tersisa terlebih dahulu kepada setiap baris card. Itu sebabnya ruang pada sisi baris card awal dan baris card akhir yang berbatasan tepi tidak sama dengan ruang antara baris card, karena ruang antara baris card merupakan gabungan dua ruang.space-evenly: Nilai ini akan membagi rata ruang yang tersisa baik antara sesama baris card maupun antara baris card dan tepinya.
/* 7. Property align-content */
.align-content {
align-content: center;
display: flex;
/* Tambahan agar efeknya terlihat */
flex-wrap: wrap;
height: 400px;
}

8. Property gap
gap akan memberikan jarak di antara card yang saling bertemu.
/* 8. Property gap */
.gap {
display: flex;
gap: 20px;
}
.gap > .card {
/* Tambahan agar efeknya terlihat */
margin: 0;
}

9. Property order
order akan mengatur urutan tampilan card. Tidak seperti property sebelumnya yang ditambahkan pada elemen container, property ini (termasuk property CSS Flexbox setelah ini) ditambahkan pada elemen card.
/* 9. Property order */
.order {
display: flex;
}
.order > .card:nth-child(1) {
order: 1;
}

Perlu diingat bahwa semakin besar nilai yang diberikan, maka akan semakin akhir card ditampilkan. Jika ada card dengan nilai order yang sama, maka urutannya akan kembali didasarkan pada urutan penulisan elemennya di berkas HTML.
10. Property align-self
align-self serupa dengan align-items (termasuk nilai-nilainya). Bedanya, ini hanya untuk mengatur salah satu card-nya saja.
/* 10. Property flex-grow */
.align-self {
display: flex;
}
.align-self > .card:nth-child(2) {
align-self: center;
}

11. Property flex-grow
flex-grow akan membuat lebar card adaptif terhadap ruang kosong yang tersisa di dalam barisnya. Secara bawaan nilai dari property ini adalah 0 sehingga lebar card tetap mematuhi nilai yang sudah ditetapkan pada property width-nya.
/* 11. Property flex-grow */
.flex-grow {
display: flex;
}
.flex-grow > .card:nth-child(2) {
flex-grow: 1;
}

12. Property flex-shrink
Pada penjelasan tentang flex-wrap, kita sudah melihat bahwa tanpa property tersebut beberapa card yang baru ditambahkan akan tampil dalam satu baris yang sama, dan ukuran lebarnya akan mengecil untuk menyesuaikan dengan lebar elemen container. Efek ini disebabkan oleh flex-shrink yang nilai bawaannya adalah 1.
Jika kita coba ubah nilai property ini menjadi 0 dan tidak menggunakan flex-wrap, maka efek mengecil tersebut akan hilang dan setelah sejumlah card sudah memenuhi lebar elemen container, card-card selanjutnya akan tembus melewati batasnya.
/* 12. Property flex-shrink */
.flex-shrink {
display: flex;
}
.flex-shrink > .card {
flex-shrink: 0;
}

13. Property flex-basis
flex-basis akan mengatur lebar card seperti halnya yang dilakukan width. Bedanya, efek dari property ini fleksibel tergantung nilai dari flex-direction pada elemen container, di mana jika diberi nilai column, maka flex-basis akan mengatur tinggi card.
Nilai bawaan dari property ini adalah auto yang akan merujuk kembali pada nilai width dan height yang telah ditetapkan.
/* 13. Property flex-basis */
.flex-basis {
display: flex;
}
.flex-basis > .card:nth-child(2) {
/* Kode berikut akan mengatur lebar card
sebesar 50%, kemudian dikurangi 20px
untuk margin-nya */
flex-basis: calc(50% - 20px);
}

14. Property flex
flex adalah shorthand dari penulisan flex-grow, flex-shrink, dan flex-basis. Nilai bawaan dari property ini adalah 0 1 auto yang artinya:
- Nilai pertama (
0) adalahflex-grow - Nilai kedua (
1) adalahflex-shrink - Nilai ketiga (
auto) adalahflex-basis
Karena kita sudah membahas tentang ketiga property tersebut, dapatkah kamu menciptakan tampilan berikut menggunakan flex?

Berikut adalah kode versi saya:
/* 14. Property flex */
.flex {
display: flex;
flex-wrap: wrap;
}
.flex > .card:nth-child(1),
.flex > .card:nth-child(2) {
flex: 0 0 calc(50% - 20px);
}
.flex > .card:nth-child(3) {
flex: 0 0 calc(100% - 20px);
}
.flex > .card:nth-child(5) {
flex: 0 0 calc(75% - 20px);
}
.flex > .card:nth-child(6) {
flex: 0 0 1700px;
}
Demikian pembahasan tentang CSS Flexbox ini. Semoga bermanfaat.



