Menu

Grid Layout CSS: Kolom, Baris, fr, gap, dan Area

CSS grid menata item dalam baris dan kolom sekaligus. Pelajari display: grid, grid-template-columns, satuan fr, repeat() dan minmax(), auto-fill vs auto-fit, menempatkan item dengan grid-column, dan grid-template-areas, dengan grid langsung yang bisa kamu edit dan ukur.

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

Grid dalam tiga baris

Atur display: grid pada container dan tulis kolom-kolomnya dengan grid-template-columns. Anak-anaknya mengisi sel secara berurutan, dari kiri ke kanan dalam bahasa Inggris, dan baris baru dimulai setiap kali kolomnya penuh:

Tujuh item, tiga kolom: dua baris penuh dan baris ketiga dengan item 7 di kolom pertama. Setiap kolom sama lebarnya, dan setiap item dalam satu baris sama tingginya, jadi tepi-tepinya sejajar di kedua arah. Itulah yang ditambahkan grid dibanding flexbox.

Playground grid

Ketik nilai grid-template-columns apa saja, atau klik salah satu preset. Teks di bawahnya menunjukkan lebar kolom yang dihitung browser (dari getComputedStyle) dan berapa baris yang dibutuhkan item-item itu:

Beberapa hal yang bisa dilihat: 1fr 2fr membuat kolom kedua tepat dua kali kolom pertama. 200px 1fr mempertahankan 200px dan memberikan sisanya ke kolom kedua. auto 1fr auto mengatur kolom luar seukuran kontennya. repeat(4, 100px) menyisakan ruang kosong di akhir karena tidak ada yang fleksibel. Nilai yang tidak valid, seperti 1fr 2, diabaikan, dan grid tetap memakai nilai valid terakhir.

Satuan fr

fr berarti "satu bagian dari ruang kosong". Browser lebih dulu mengurangi kolom yang ukurannya tetap (px, rem, %, konten auto) dan gap, lalu membagi sisanya ke kolom-kolom fr sesuai angkanya.

grid-template-columns di container 600px, tanpa gapLebar kolom
1fr 1fr 1fr200, 200, 200
1fr 2fr200, 400
100px 1fr 1fr100, 250, 250
1fr 50%300, 300

fr tidak sama dengan %: persentase ditambah gap bisa berjumlah lebih dari 100% dan meluber, sedangkan kolom fr selalu hanya membagi apa yang tersisa setelah gap.

repeat(), minmax(), dan grid responsif tanpa media query

repeat(4, 1fr) sama dengan 1fr 1fr 1fr 1fr. minmax(120px, 1fr) adalah kolom yang tidak pernah lebih sempit dari 120px dan membesar untuk mengambil bagiannya. Gabungkan keduanya dengan auto-fill atau auto-fit sebagai pengganti jumlah kolom, dan grid membuat kolom sebanyak yang muat:

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 16px;
}

Satu deklarasi itu menghasilkan kolom minimal 180px sebanyak yang muat di container: beberapa kolom di layar lebar, satu kolom di ponsel, tanpa media query. Perbedaan antara auto-fill dan auto-fit terlihat saat item-nya lebih sedikit dari jumlah kolom:

Container-nya muat lima kolom 100px. auto-fill mempertahankan kelimanya, jadi A, B, dan C masing-masing 112px dan tersisa dua kolom kosong. auto-fit menciutkan kolom yang kosong, jadi ketiga item meregang menjadi sekitar 187px masing-masing.

Menempatkan item: grid-column dan grid-row

Garis grid diberi nomor mulai dari 1 di tepi awal. grid-column: 1 / 3 berarti "dari garis 1 sampai garis 3", yaitu dua kolom. span 2 berarti "dua kolom dari mana pun posisimu", dan -1 adalah garis terakhir:

Item gelap mengisi seluruh baris pertama. Item biru menutupi blok 2 kali 2, item kuning tua dua baris. Item a dan b mengisi sel sisanya dengan sendirinya: grid menaruh setiap item yang bisa ditaruhnya ke sel kosong berikutnya. grid-auto-rows: 60px mengatur tinggi baris yang tidak kamu deklarasikan dengan grid-template-rows.

grid-template-areas: memberi nama bagian-bagian tata letak

Untuk tata letak halaman, beri nama area-areanya lalu gambar sebagai teks. Setiap string adalah satu baris, setiap kata satu sel, dan item bergabung ke sebuah area dengan grid-area:

Header dan footer membentang di kedua kolom karena namanya mengisi kedua sel di barisnya. Baris tengah bernilai 1fr, jadi mengambil sisa tinggi dari 280px itu. Untuk menumpuk semuanya di ponsel, sebuah media query cukup menggambar ulang area-areanya sebagai satu kolom: grid-template-areas: "header" "side" "main" "footer" dengan grid-template-columns: 1fr. Halaman media query menunjukkan polanya.

Perataan di dalam sel

Item grid meregang mengisi selnya secara default. Properti-properti ini menggerakkannya di dalam sel:

PropertiPadaMenggerakkan
justify-itemscontainersetiap item di sepanjang baris (sumbu inline)
align-itemscontainersetiap item ke atas dan ke bawah (sumbu block)
place-itemscontainershorthand: place-items: center menengahkan ke dua arah
justify-self / align-selfitemsatu item
justify-content / align-contentcontainerseluruh kumpulan track, saat grid lebih kecil dari container

display: grid; place-items: center; adalah cara terpendek untuk menengahkan satu anak di dalam kotak.

Grid atau flexbox

Grid bersifat dua dimensi: kamu menentukan kolom (dan baris), lalu konten mengisinya, jadi setiap kartu di galeri punya lebar yang sama bahkan di baris terakhir. Flexbox bersifat satu dimensi: item menentukan ukurannya sendiri dari konten di sepanjang satu garis. Keduanya bisa dipadukan dengan baik: grid untuk halaman dan galeri kartu, flexbox di dalam setiap kartu untuk baris header-nya. Halaman flexbox membahas separuh lainnya.

Urutan dan aksesibilitas

grid-template-areas, grid-row, grid-column, dan order bisa menaruh item di mana saja, tetapi pembaca layar dan tombol Tab tetap mengikuti urutan HTML. Jaga agar urutan sumbernya bermakna (header, navigasi, main, footer) dan pakai grid untuk menatanya, bukan untuk memperbaiki urutan HTML yang tidak masuk akal.

Kesalahan umum

  • Menaruh display: grid di item. Properti ini ditaruh di induk; hanya anak langsung yang menjadi item grid.
  • Memakai persentase bersama gap. grid-template-columns: 50% 50% ditambah gap: 16px meluber 16px. Pakai 1fr 1fr.
  • auto-fill padahal yang kamu mau auto-fit. Dengan sedikit item, auto-fill menyisakan kolom kosong. Ganti ke auto-fit agar item-nya meregang.
  • Kolom 1fr yang membesar melebihi bagiannya. Kolom 1fr tidak akan menyusut lebih kecil dari konten terpanjangnya (URL panjang, gambar lebar). Pakai minmax(0, 1fr) agar bisa menyusut.
  • String area yang tidak berbentuk persegi panjang. Setiap area bernama harus membentuk persegi panjang, dan setiap string baris harus punya jumlah sel yang sama, kalau tidak seluruh deklarasi grid-template-areas diabaikan.
  • Lupa bahwa nomor garis dimulai dari 1. Tiga kolom punya empat garis: 1 / 4 atau 1 / -1 membentang di ketiganya.

Pertanyaan yang sering diajukan

Apa itu CSS grid?

CSS grid adalah sistem tata letak yang menempatkan elemen dalam baris dan kolom sekaligus. Kamu mengatur display: grid pada sebuah container, menjelaskan kolomnya dengan grid-template-columns (dan barisnya jika perlu), lalu anak langsungnya mengisi sel-sel secara berurutan.

Apa arti 1fr di CSS grid?

fr adalah bagian dari ruang kosong di grid container. grid-template-columns: 1fr 1fr 1fr menghasilkan tiga kolom yang sama lebar, dan 1fr 2fr membuat kolom kedua dua kali lebih lebar dari kolom pertama. Ukuran tetap dan gap dikurangi lebih dulu; kolom fr membagi sisanya.

Apa perbedaan auto-fill dan auto-fit?

Keduanya membuat kolom sebanyak yang muat. auto-fill mempertahankan kolom yang kosong, jadi beberapa item tetap sempit dan menyisakan ruang kosong di akhir baris. auto-fit menciutkan kolom yang kosong, jadi item meregang mengisi baris. Jika item cukup banyak untuk mengisi baris, keduanya terlihat sama.

Bagaimana cara membuat item grid membentang dua kolom?

Pakai grid-column: span 2 pada item, atau beri garis awal dan akhir: grid-column: 1 / 3 mencakup kolom 1 dan 2. grid-column: 1 / -1 membentang selebar penuh, karena -1 adalah garis terakhir.

Kapan sebaiknya memakai grid alih-alih flexbox?

Pakai grid saat baris dan kolom harus sejajar satu sama lain: galeri kartu, form dengan label yang sejajar, halaman dengan header, sidebar, dan footer. Pakai flexbox untuk satu baris atau kolom yang item-nya menentukan ukuran dari kontennya, seperti nav bar.

Apakah grid-gap sama dengan gap?

Ya. grid-gap, grid-row-gap, dan grid-column-gap adalah nama lamanya. Browser masih menerimanya sebagai alias, tetapi tulislah gap, row-gap, dan column-gap, yang juga berfungsi di flexbox.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai