flex-wrap: satu baris, atau sebanyak yang dibutuhkan
Secara default, flex container menaruh semua item-nya dalam satu baris (flex-wrap: nowrap) dan menyusutkannya agar muat. flex-wrap: wrap membiarkan item tetap berukuran sama dan pindah ke baris berikutnya:
Setiap item meminta 100px, ada lima di dalam kotak 340px. Lima item dan empat gap 8px butuh 532px, jadi tanpa wrap setiap item dimampatkan menjadi sekitar 62px, karena item flex menyusut secara default. Dengan wrap, item tetap 100px: tiga muat di baris pertama dan dua sisanya pindah ke baris kedua.
Nilai flex-wrap
| Nilai | Yang terjadi |
|---|---|
nowrap (default) | Satu baris. Item menyusut, dan meluber keluar wadah begitu tidak bisa menyusut lagi |
wrap | Item yang tidak muat memulai baris baru di bawahnya |
wrap-reverse | Sama, tetapi baris baru bertumpuk ke atas: baris pertama ada di bawah |
Lihat item yang wrap
Geser slider untuk mengubah lebar wadah. Teks di bawahnya menghitung jumlah baris dan berapa item di setiap baris:
Di lebar 400px, empat item 90px dan tiga gap 8px (384px) muat dalam satu baris, jadi hasilnya 4 + 2. Geser ke arah 620px dan keenamnya muat di satu baris; geser ke arah 120px dan setiap item mendapat barisnya sendiri.
flex-direction: baris atau kolom
flex-direction mengatur arah aliran item, yaitu sumbu utama:
| Nilai | Item berjalan | Item pertama |
|---|---|---|
row (default) | berdampingan, sesuai arah tulisan | di awal baris |
row-reverse | berdampingan, terbalik | di akhir baris |
column | bertumpuk, dari atas ke bawah | di atas |
column-reverse | bertumpuk, dari bawah ke atas | di bawah |
Di dua kotak row, item meregang setinggi kotak, karena align-items: stretch bekerja melintasi baris. Di kotak column, item justru meregang selebar penuh lebar kotak, dengan alasan yang sama. Sumbunya berputar, dan setiap properti perataan ikut berputar (halaman justify-content menunjukkannya secara rinci).
flex-flow: keduanya dalam satu baris
flex-flow adalah shorthand untuk flex-direction lalu flex-wrap:
.cards { flex-flow: row wrap; } /* flex-direction: row; flex-wrap: wrap; */
.stack { flex-flow: column nowrap; } /* flex-direction: column; flex-wrap: nowrap; */
Kartu responsif dengan wrap tanpa media query
Beri setiap item ukuran awal dengan flex: 1 1 180px dan biarkan barisnya wrap. Setiap item membesar untuk mengisi barisnya, dan saat sebuah baris tidak muat lagi untuk item 180px berikutnya, item itu pindah ke baris baru:
Di pratinjau selebar sekitar 800px, tiga kartu muat di baris pertama (masing-masing sekitar 253px) dan dua kartu terakhir berbagi baris kedua, tempat masing-masing membesar menjadi sekitar 386px. Begitulah cara kerja flexbox: setiap baris membagi ruangnya sendiri, jadi kartu di baris terakhir yang pendek jadi lebih lebar dari kartu di atasnya. Jika kamu ingin kartu terakhir tetap selebar kartu lainnya, pakai grid dengan repeat(auto-fill, minmax(180px, 1fr)) (lihat halaman grid).
align-content: mengatur jarak antarbaris
Saat sebuah wadah wrap dan lebih tinggi dari baris-barisnya, align-content menentukan letak baris-baris itu. Nilainya sama dengan justify-content, ditambah stretch:
Di kotak pertama, kedua baris berada di atas. Di kotak kedua, baris pertama berada di atas dan baris kedua di bawah, dengan semua sisa tinggi di antaranya.
Urutan terbalik dan aksesibilitas
row-reverse, column-reverse, dan wrap-reverse hanya mengubah tempat item digambar. Pembaca layar dan tombol Tab tetap mengikuti urutan HTML, jadi pengguna keyboard berpindah antar-item dengan arah yang berlawanan dari yang mereka lihat. Balik urutan hanya untuk efek visual; jika urutannya punya makna, ubah di HTML.
Kesalahan umum
- Item yang menyusut alih-alih wrap. Item dengan
flex: 1dimulai dariflex-basis0 dan berdesakan di satu baris. Beri basis yang nyata, sepertiflex: 1 1 200px. - Menaruh
flex-wrapdi item. Properti ini milik flex container. - Memakai
align-itemsuntuk mengatur jarak baris yang wrap. Itu meratakan item di dalam setiap baris; baris-barisnya sendiri dipindahkan denganalign-content. - Item terakhir yang sendirian meregang selebar seluruh baris. Itulah
flex-growpada baris yang hanya punya satu item. Pakai grid jika setiap kartu harus sama lebarnya. - Berharap
flex-direction: columnmengisi sebuah tinggi. Kolom container hanya setinggi isinya kecuali kamu memberinyaheight, jadijustify-contenttidak punya ruang untuk bekerja.
Pertanyaan yang sering diajukan
Apa fungsi flex-wrap: wrap?
Nilai ini membuat item flex pindah ke baris baru saat tidak muat dalam satu baris. Dengan nowrap default, item tetap di satu baris dan menyusut, atau meluber keluar wadah jika tidak bisa menyusut lagi.
Kenapa flex-wrap tidak berfungsi?
Wrap hanya terjadi jika ukuran awal item-item dijumlahkan lebih besar dari wadahnya. Item dengan flex: 1 dimulai dari flex-basis 0, jadi tidak pernah wrap; beri ukuran awal yang nyata (flex: 1 1 200px atau width: 200px). Periksa juga bahwa flex-wrap ditaruh di flex container, bukan di item-nya.
Apa perbedaan flex-direction row dan column?
row (default) menaruh item berdampingan sesuai arah tulisan, dan column menumpuknya dari atas ke bawah. Sumbu utama ikut berputar, jadi di dalam kolom justify-content bekerja secara vertikal dan align-items secara horizontal.
Apa itu flex-flow?
Shorthand untuk flex-direction dan flex-wrap dalam satu deklarasi: flex-flow: row wrap; sama dengan flex-direction: row; flex-wrap: wrap;.
Apa perbedaan align-items dan align-content?
align-items menempatkan item di dalam barisnya. align-content menempatkan baris-baris itu sendiri di dalam wadah, jadi hanya berpengaruh jika wadahnya memakai flex-wrap: wrap dan lebih tinggi dari baris-barisnya.