Dua properti perataan tersisa sering terlewat karena keduanya butuh kondisi khusus untuk terlihat bekerja. align-content hanya bereaksi ketika item terbagi ke beberapa baris; align-self baru terasa ketika satu item perlu menyingkir dari aturan kawan-kawannya. Padahal justru situasi-situasi itulah yang muncul terus dalam layout nyata — galeri kartu bertingkat dan satu ikon keranjang yang posisinya beda sendiri di menu.

align-content: Mengatur Baris, Bukan Item #

align-items meratakan item di dalam barisnya masing-masing. align-content bekerja satu tingkat di atasnya: mendistribusikan baris-baris itu sendiri di sepanjang cross axis container. Nilai-nilainya akrab karena mengikuti pola justify-content:

NilaiPerilaku antar baris
stretch (default)Baris meregang mengisi sisa tinggi container
flex-startBaris menumpuk di awal cross axis
flex-endBaris menumpuk di akhir cross axis
centerBaris berkumpul di tengah
space-betweenBaris pertama di awal, terakhir di akhir, sisa di antara
space-around / space-evenlyRuang di sekitar baris / semua jarak sama besar

Dua syarat membuatnya bereaksi, dan meleset dari salah satunya menjadi penyebab keluhan “align-content saya tidak berfungsi” — keluhan yang hampir selalu berakhir di salah satu syarat berikut:

css
.galeri-wrap {
  display: flex;
  flex-wrap: wrap;      /* syarat 1: item harus bisa multi-baris */
  align-content: space-between;
  height: 320px;        /* syarat 2: cross axis harus lebih tinggi dari isi */
  gap: 12px;
}

Demo berikut memenuhi kedua syarat itu sekaligus menambahkan satu pengecualian align-self pada satu kotak:

Dengan container nowrap, semua item berada dalam satu baris — tidak ada jarak antar baris yang bisa didistribusikan. Dengan container tingginya pas-pasan terhadap isi, sisa ruangnya nol. Dalam dua kondisi itu align-content memang tidak punya pekerjaan, bukan sedang bermasalah.

Dengan seluruh properti perataan sudah diperkenalkan, peta tiga tingkatnya bisa dirangkum sekali untuk dipegang:

TingkatPropertyBerlaku padaSyarat khas
Container, main axisjustify-contentSemua itemAda ruang sisa
Container, cross axisalign-itemsItem dalam barisnyaSelalu bekerja
Container, cross axisalign-contentBaris-baris hasil wrapwrap + tinggi container lebih besar dari isi
Itemalign-selfSatu item sajaSelalu bekerja

align-self: Pengecualian per Item #

align-self adalah satu-satunya properti perataan yang ditulis pada flex item, bukan container. Fungsinya menimpa align-items untuk satu item tertentu:

css
.badge-promo {
  align-self: flex-end; /* melawan default stretch milik container */
}

Nilai yang tersedia sama dengan align-items — stretch, flex-start, flex-end, center, baseline — ditambah auto sebagai nilai default yang artinya “ikuti keputusan container”. Pola pemakaiannya umumnya dua:

  • Satu item berbeda posisi: ikon keranjang di menu yang turun ke dasar barisnya, badge diskon yang menempel bawah kartu, atau tombol bantuan di ujung atas.
  • Satu item berbeda besaran: item pendek yang tidak ikut meregang ketika kawan-kawannya memenuhi tinggi baris.

Kesalahan Umum #

GejalaPenyebabPerbaikan
align-content tidak bereaksi sama sekaliContainer nowrap atau tingginya pas dengan isiTambahkan flex-wrap: wrap dan tinggi eksplisit
Baris jadi makin rapat setelah menulis align-contentNilai stretch default sempat meregangkan barisSadari pergantian nilai; pilih pola space-* atau flex-start
align-self menggeser item ke sampingDiharapkan bekerja di main axisUntuk main axis, pakai margin auto pada item

Ringkasan #

align-content mendistribusikan baris-baris hasil wrap di sepanjang cross axis, dengan syarat container benar-benar multi-baris dan lebih tinggi dari isinya; align-self memberi satu item kewenangan menimpa align-items dari container. Keduanya melengkapi peta perataan Flexbox yang kini utuh di ketiga level: container, baris, dan item. Tinggal satu aspek penataan yang belum rapi — jarak antar item dan antar barisnya, yang akan kita selesaikan dengan satu deklarasi gap.