Menu

Flexbox CSS: display flex, Sumbu, Perataan, dan flex

Flexbox menata item dalam satu baris atau kolom dan mengatur bagaimana item berbagi ruang dan berjajar. Pelajari display: flex, sumbu utama dan sumbu silang, setiap properti container, flex-grow, flex-shrink, dan flex-basis, dengan playground langsung yang mengukur posisi setiap item.

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

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. Dengan stretch default, item 1 tidak punya tinggi sendiri dan mengisi seluruh 170px tinggi container.
  • flex-direction: column: sekarang justify-content menggerakkan item secara vertikal dan align-items secara 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-directionSumbu utamaSumbu silangjustify-content menggerakkan itemalign-items menggerakkan item
row (default)horizontal, sesuai urutan bacavertikalsecara horizontalsecara vertikal
row-reversehorizontal, terbalikvertikalsecara horizontalsecara vertikal
columnvertikal, dari atas ke bawahhorizontalsecara vertikalsecara horizontal
column-reversevertikal, dari bawah ke atashorizontalsecara vertikalsecara 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:

PropertiFungsinyaDefault
flex-directionBaris atau kolom, dan ke arah manarow
flex-wrapApakah item pindah ke baris baru saat kehabisan ruangnowrap
flex-flowShorthand untuk flex-direction dan flex-wraprow nowrap
justify-contentPenempatan dan jarak di sepanjang sumbu utamanormal (berperilaku seperti flex-start)
align-itemsPenempatan item di sepanjang sumbu silangnormal (berperilaku seperti stretch)
align-contentJarak antarbaris saat item wrapnormal
gapJarak 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 (auto berarti "pakai width atau kontenku").
  • flex-grow: berapa bagian dari ruang sisa yang diambil item. 0 berarti item tidak pernah membesar.
  • flex-shrink: seberapa banyak item mengalah saat ruangnya tidak cukup. 0 berarti item tidak pernah menyusut.

Shorthand flex mengatur ketiganya:

Kamu menulisArtinyaPerilaku
flex: initial (default)0 1 autoUkuran konten, boleh menyusut, tidak pernah membesar
flex: 11 1 0%Dimulai dari nol dan mengambil bagian ruang yang sama rata
flex: auto1 1 autoUkuran konten ditambah bagian dari ruang sisa
flex: none0 0 autoPersis seukuran konten atau width-nya, tidak pernah membesar atau menyusut
flex: 22 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: flex di item, bukan di induknya. Container yang diberi display: flex; anak-anaknya adalah item.
  • Berharap align-items menggerakkan 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. Tambahkan min-width: 0 pada item yang seharusnya menyusut.
  • Memakai flex: 1 lalu heran kenapa lebarnya berbeda. Item dengan flex: 1 berbagi ruang sama rata, tetapi item yang kontennya tidak muat (URL panjang, gambar) tidak akan menyusut lebih kecil dari kontennya. min-width: 0 juga memperbaikinya.
  • Margin di antara item. Pakai gap pada 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai