Menu

flex-wrap dan flex-direction CSS: Baris, Kolom, Wrap

flex-wrap menentukan apakah item flex berdesakan di satu baris atau pindah ke baris berikutnya, dan flex-direction menentukan apakah item berjalan dalam baris atau kolom. Pelajari keduanya dengan contoh langsung, shorthand flex-flow, align-content, dan deretan kartu responsif tanpa media query.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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

NilaiYang terjadi
nowrap (default)Satu baris. Item menyusut, dan meluber keluar wadah begitu tidak bisa menyusut lagi
wrapItem yang tidak muat memulai baris baru di bawahnya
wrap-reverseSama, 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:

NilaiItem berjalanItem pertama
row (default)berdampingan, sesuai arah tulisandi awal baris
row-reverseberdampingan, terbalikdi akhir baris
columnbertumpuk, dari atas ke bawahdi atas
column-reversebertumpuk, dari bawah ke atasdi 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: 1 dimulai dari flex-basis 0 dan berdesakan di satu baris. Beri basis yang nyata, seperti flex: 1 1 200px.
  • Menaruh flex-wrap di item. Properti ini milik flex container.
  • Memakai align-items untuk mengatur jarak baris yang wrap. Itu meratakan item di dalam setiap baris; baris-barisnya sendiri dipindahkan dengan align-content.
  • Item terakhir yang sendirian meregang selebar seluruh baris. Itulah flex-grow pada baris yang hanya punya satu item. Pakai grid jika setiap kartu harus sama lebarnya.
  • Berharap flex-direction: column mengisi sebuah tinggi. Kolom container hanya setinggi isinya kecuali kamu memberinya height, jadi justify-content tidak 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai