Fungsi display: flex
Taruh display: flex pada sebuah induk, dan anak langsungnya berjajar dalam satu baris, berdampingan, dan meregang dengan tinggi yang sama. Satu deklarasi itu menggantikan float, inline-block, dan sebagian besar trik pemosisian untuk menata deretan elemen.
Di kotak pertama, setiap div mengambil satu baris penuh. Di kotak kedua, ketiga item berada dalam satu baris, masing-masing hanya selebar kontennya, dan One serta Three meregang setinggi Two. Hanya induknya yang berubah: display: flex ditaruh di container, tidak pernah di item-nya.
Playground flexbox
Pilih nilai-nilainya dan lihat item-nya bergerak. Baris kode di bawah kotak adalah CSS untuk apa yang kamu lihat, dan daftar di bawahnya adalah posisi sebenarnya yang ditempatkan browser untuk setiap item, diukur dengan getBoundingClientRect().
Hal-hal yang bisa dicoba:
justify-content: space-between: item 1 berada di x 0 dan item 3 menyentuh tepi yang jauh.align-items: center: ketiga item mempertahankan tingginya sendiri dan titik tengahnya sejajar. Denganstretchdefault, item 1 tidak punya tinggi sendiri dan mengisi seluruh 170px tinggi container.flex-direction: column: sekarangjustify-contentmenggerakkan item secara vertikal danalign-itemssecara horizontal. Kedua properti itu mengikuti sumbu, bukan layar.
Sumbu utama dan sumbu silang
Setiap flex container punya dua sumbu. Sumbu utama adalah arah aliran item, yang diatur oleh flex-direction. Sumbu silang melintang terhadapnya.
flex-direction | Sumbu utama | Sumbu silang | justify-content menggerakkan item | align-items menggerakkan item |
|---|---|---|---|---|
row (default) | horizontal, sesuai urutan baca | vertikal | secara horizontal | secara vertikal |
row-reverse | horizontal, terbalik | vertikal | secara horizontal | secara vertikal |
column | vertikal, dari atas ke bawah | horizontal | secara vertikal | secara horizontal |
column-reverse | vertikal, dari bawah ke atas | horizontal | secara vertikal | secara horizontal |
Di halaman yang ditulis dari kanan ke kiri (dir="rtl"), row dimulai dari tepi kanan, karena sumbu utama mengikuti arah tulisan.
Properti container
Properti-properti ini ditaruh di elemen yang punya display: flex:
| Properti | Fungsinya | Default |
|---|---|---|
flex-direction | Baris atau kolom, dan ke arah mana | row |
flex-wrap | Apakah item pindah ke baris baru saat kehabisan ruang | nowrap |
flex-flow | Shorthand untuk flex-direction dan flex-wrap | row nowrap |
justify-content | Penempatan dan jarak di sepanjang sumbu utama | normal (berperilaku seperti flex-start) |
align-items | Penempatan item di sepanjang sumbu silang | normal (berperilaku seperti stretch) |
align-content | Jarak antarbaris saat item wrap | normal |
gap | Jarak antar-item (row-gap, column-gap) | 0 |
justify-content dan align-items masing-masing punya halaman sendiri berisi setiap nilainya: justify-content dan align-items. Wrap dan arah ada di halaman flex-wrap.
Properti item: flex-grow, flex-shrink, flex-basis
Properti-properti ini ditaruh di anak-anaknya dan menentukan cara mereka berbagi lebar container:
flex-basis: ukuran awal item sebelum ruang kosong dibagikan (autoberarti "pakai width atau kontenku").flex-grow: berapa bagian dari ruang sisa yang diambil item.0berarti item tidak pernah membesar.flex-shrink: seberapa banyak item mengalah saat ruangnya tidak cukup.0berarti item tidak pernah menyusut.
Shorthand flex mengatur ketiganya:
| Kamu menulis | Artinya | Perilaku |
|---|---|---|
flex: initial (default) | 0 1 auto | Ukuran konten, boleh menyusut, tidak pernah membesar |
flex: 1 | 1 1 0% | Dimulai dari nol dan mengambil bagian ruang yang sama rata |
flex: auto | 1 1 auto | Ukuran konten ditambah bagian dari ruang sisa |
flex: none | 0 0 auto | Persis seukuran konten atau width-nya, tidak pernah membesar atau menyusut |
flex: 2 | 2 1 0% | Dua kali bagian item dengan flex: 1 |
Setiap baris selebar 480px di dalam padding-nya, dan dua gap 8px menyisakan 464px untuk item-item. Lebar yang dicetak menunjukkan cara pembagiannya: masing-masing sekitar 155px di baris pertama, 116 + 232 + 116 di baris kedua (item flex: 2 mendapat dua kali bagian setiap tetangganya), dan 100 + 372 di baris ketiga, tempat item flex: none mempertahankan lebarnya dan item lain mengambil semua sisanya.
Tata letak sungguhan dengan flexbox
Header dengan logo di awal dan link di akhir adalah tata letak flex yang paling umum. margin-inline-start: auto pada satu item menghabiskan semua ruang kosong sebelumnya dan mendorong item itu beserta semua yang setelahnya ke akhir:
align-items: center menyejajarkan teks logo yang lebih besar dengan link-link, dan gap memberi jarak antar-link tanpa perlu margin yang harus dibatalkan di link terakhir.
Pola sehari-hari kedua adalah baris media: ikon berukuran tetap dan teks yang mengambil sisa ruang serta wrap di kolomnya sendiri.
flex: none adalah jaminannya. Item flex menyusut secara default, jadi jika kamu menghapusnya dari lingkaran dan juga menghapus flex: 1 dari teks, paragrafnya memampatkan lingkaran itu menjadi sekitar 23px: sebuah oval. Untuk menengahkan satu hal di dalam kotak, flexbox cukup dua baris (justify-content: center; align-items: center); halaman membuat div di tengah membandingkannya dengan cara-cara lain.
order dan aksesibilitas
Properti order dan arah -reverse mengubah tempat item tampil, bukan posisinya di HTML. Pembaca layar dan tombol Tab tetap mengikuti urutan HTML, jadi pengguna keyboard bisa melompat dari link pertama di layar ke link terakhir. Pakai keduanya hanya untuk dekorasi; jika urutannya punya makna, ubah HTML-nya.
Flexbox atau grid
Flexbox bekerja dalam satu arah dalam satu waktu: item dalam satu baris menentukan ukurannya dari konten, dan baris kedua (dengan wrap) tidak sejajar dengan baris pertama. Grid bekerja dalam dua arah: kamu menentukan kolom dan baris, lalu item menempati posisinya. Nav bar, toolbar, atau baris form adalah flexbox; galeri atau halaman dengan sidebar adalah grid.
Kesalahan umum
display: flexdi item, bukan di induknya. Container yang diberidisplay: flex; anak-anaknya adalah item.- Berharap
align-itemsmenggerakkan item secara vertikal tanpa tinggi. Jika container hanya setinggi item tertingginya, tidak ada ruang untuk bergerak. Beri container sebuah tinggi; atau sebenarnya properti itu sudah bekerja, hanya saja tidak ada yang perlu dilakukan. - Teks yang meluber alih-alih menyusut. Item flex punya
min-width: auto. Tambahkanmin-width: 0pada item yang seharusnya menyusut. - Memakai
flex: 1lalu heran kenapa lebarnya berbeda. Item denganflex: 1berbagi ruang sama rata, tetapi item yang kontennya tidak muat (URL panjang, gambar) tidak akan menyusut lebih kecil dari kontennya.min-width: 0juga memperbaikinya. - Margin di antara item. Pakai
gappada container; gap hanya ada di antara item. - Membuat flex bersarang tanpa perlu. Hanya anak langsung yang menjadi item flex. Cucu mengikuti tata letak normal kecuali induknya sendiri juga
display: flex.
Pertanyaan yang sering diajukan
Apa fungsi display: flex?
Nilai ini mengubah elemen menjadi flex container. Anak langsungnya menjadi item flex dan secara default ditaruh dalam satu baris, berdampingan, meregang dengan tinggi yang sama, dengan properti seperti justify-content, align-items, dan gap yang mengatur cara item berbagi ruang.
Apa arti flex: 1?
flex: 1 adalah singkatan dari flex: 1 1 0%: item boleh membesar (flex-grow: 1), boleh menyusut (flex-shrink: 1), dan dimulai dari ukuran nol (flex-basis: 0%). Item yang semuanya punya flex: 1 membagi ruang kosong sama rata, jadi lebarnya akhirnya sama kecuali kontennya tidak muat.
Apa perbedaan justify-content dan align-items?
justify-content menempatkan item di sepanjang sumbu utama (horizontal pada baris), dan align-items menempatkannya di sepanjang sumbu silang (vertikal pada baris). Dengan flex-direction: column, kedua sumbu bertukar, jadi justify-content menjadi vertikal.
Sebaiknya pakai flexbox atau grid?
Pakai flexbox untuk satu baris atau kolom yang item-nya menentukan ukuran dari kontennya: nav bar, kelompok tombol, label di samping input. Pakai grid saat kamu ingin baris dan kolom yang sejajar satu sama lain, seperti grid kartu atau tata letak halaman.
Kenapa item flex saya meluber keluar wadahnya?
Item flex punya min-width: auto secara default, jadi item itu menolak menyusut lebih kecil dari lebar kata terpanjang atau anak terlebarnya. Atur min-width: 0 (atau overflow: hidden) pada item agar bisa menyusut, misalnya supaya text-overflow: ellipsis berfungsi.
Apakah flexbox berfungsi pada elemen inline seperti span?
Ya. Elemen apa pun dengan display: flex adalah flex container, dan anak-anaknya menjadi item flex apa pun nilai display mereka sendiri, jadi anak <span> tidak lagi inline dan menerima width, height, serta margin seperti block.