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 gap | Lebar kolom |
|---|---|
1fr 1fr 1fr | 200, 200, 200 |
1fr 2fr | 200, 400 |
100px 1fr 1fr | 100, 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:
| Properti | Pada | Menggerakkan |
|---|---|---|
justify-items | container | setiap item di sepanjang baris (sumbu inline) |
align-items | container | setiap item ke atas dan ke bawah (sumbu block) |
place-items | container | shorthand: place-items: center menengahkan ke dua arah |
justify-self / align-self | item | satu item |
justify-content / align-content | container | seluruh 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: griddi item. Properti ini ditaruh di induk; hanya anak langsung yang menjadi item grid. - Memakai persentase bersama gap.
grid-template-columns: 50% 50%ditambahgap: 16pxmeluber 16px. Pakai1fr 1fr. auto-fillpadahal yang kamu mauauto-fit. Dengan sedikit item,auto-fillmenyisakan kolom kosong. Ganti keauto-fitagar item-nya meregang.- Kolom
1fryang membesar melebihi bagiannya. Kolom1frtidak akan menyusut lebih kecil dari konten terpanjangnya (URL panjang, gambar lebar). Pakaiminmax(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-areasdiabaikan. - Lupa bahwa nomor garis dimulai dari 1. Tiga kolom punya empat garis:
1 / 4atau1 / -1membentang 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.