CSS Grid Layout Tracks Areas Autoplacement Minmax Fr
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama CSS untuk melanjutkan topik lainnya.
Kembali ke rujukan utama CSS untuk melanjutkan topik lainnya.
CSS Grid Layout adalah sistem layout dua dimensi di CSS untuk mengatur elemen dalam baris dan kolom secara bersamaan.
Grid paling berguna saat kamu perlu mendefinisikan struktur ruang: area header, sidebar, konten utama, kartu, form multi-kolom, atau susunan komponen yang harus tetap rapi di beberapa ukuran layar.
Pakai Grid kalau masalah utamanya adalah layout area.
Contoh situasi yang biasanya lebih cocok untuk Grid:
Pakai Flexbox kalau masalah utamanya adalah distribusi item pada satu sumbu.
Contoh yang biasanya lebih cocok untuk Flexbox:
Ringkasnya:
Kalau kamu ingin membaca Grid dengan cepat, bayangkan urutannya begini:
Mental model yang berguna:
Kalau kamu bisa membayangkan garis-garis itu, Grid biasanya jadi jauh lebih gampang dibaca daripada sekadar menghafal properti.
Elemen dengan display: grid menjadi grid container.
Anak langsungnya menjadi grid item.
.layout {
display: grid;
}Begitu container aktif, properti seperti grid-template-columns, grid-template-rows, gap, dan grid-template-areas mulai membentuk struktur layout.
Track adalah jalur ruang di Grid.
Kamu mendefinisikan track lewat grid-template-columns dan grid-template-rows.
.page {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: auto 1fr;
}Contoh di atas berarti:
240px1frauto)1fr)fr: unit fraksi ruangfr berarti fraksi dari ruang yang tersedia.
.grid {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
}Artinya ruang sisa dibagi menjadi 4 bagian:
Jadi kolom tengah dua kali lebih lebar dari dua kolom lain.
frfr bukan ukuran absolut.
fr bekerja setelah ukuran tetap dan ukuran konten yang relevan dihitung. Karena itu, fr sangat cocok untuk layout yang fleksibel, tetapi tetap perlu dipasangkan dengan batas minimum yang masuk akal.
minmax(): memberi batas bawah dan atasminmax(min, max) dipakai untuk memberi rentang ukuran track.
.cards {
display: grid;
grid-template-columns: repeat(3, minmax(180px, 1fr));
}Di sini setiap kolom:
180px1frminmax() penting karena fr tanpa batas minimum bisa membuat item terlalu sempit ketika ruang mengecil.
minmax().cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 1rem;
}Ini salah satu pola Grid yang paling sering dipakai untuk card list.
.shell {
display: grid;
grid-template-columns: minmax(220px, 280px) minmax(0, 1fr);
}Pola ini menjaga sidebar tidak terlalu kecil, sementara konten utama tetap fleksibel.
gap: jarak antar trackgap mengatur jarak antar baris dan kolom tanpa perlu margin manual pada item.
.grid {
display: grid;
gap: 1rem;
}Bisa juga dibedakan:
.grid {
row-gap: 1rem;
column-gap: 1.5rem;
}Atau shorthand:
.grid {
gap: 1rem 1.5rem;
}gap lebih aman daripada margin antar itemgrid-template-areas dipakai untuk memberi nama area layout.
.layout {
display: grid;
grid-template-columns: 240px 1fr 280px;
grid-template-areas:
"header header header"
"sidebar content aside"
"footer footer footer";
}
.header { grid-area: header; }
Pendekatan ini bagus saat layout punya struktur yang jelas dan ingin dibaca seperti peta.
Kalau item tidak diberi posisi eksplisit, Grid akan menempatkannya otomatis.
Urutan defaultnya mengikuti alur baris, kiri ke kanan, lalu turun ke baris berikutnya.
.list {
display: grid;
grid-template-columns: repeat(3, 1fr);
}Dengan container seperti itu, item akan mengisi slot dari kiri ke kanan sampai baris penuh, lalu lanjut ke baris berikutnya.
Kalau kamu ingin item berjalan dari atas ke bawah dulu, atau ingin pola pengisian tertentu, gunakan properti seperti:
grid-auto-flowgrid-columngrid-rowContoh:
.list {
display: grid;
grid-auto-flow: row;
}Item bisa ditempatkan dengan garis grid.
.hero {
grid-column: 1 / 3;
grid-row: 1 / 2;
}Artinya item membentang dari garis kolom 1 sampai 3, dan dari baris 1 sampai 2.
Kalau kamu melihat 1 / 3, baca itu sebagai:
Jadi item mencakup track di antaranya.
.app-shell {
display: grid;
grid-template-columns: 280px minmax(0, 1fr);
grid-template-rows: auto 1fr;
grid-template-areas:
"sidebar header"
"sidebar content";
}Pola ini cocok untuk dashboard atau panel admin.
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 1rem;
}Ini pola default yang sangat sering dipakai saat item berbentuk kartu.
.form-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 1rem;
}Cocok untuk form yang punya beberapa field yang perlu sejajar.
.article-layout {
display: grid;
grid-template-columns: minmax(0, 1fr) 320px;
gap: 2rem;
}Pola ini umum untuk konten utama dengan sidebar referensi atau TOC.
fr selalu aman tanpa minimumKalau hanya memakai 1fr 1fr 1fr, layout bisa terlalu rapuh ketika konten butuh ruang minimum.
Solusi umum:
minmax()auto-fit dan auto-fillKeduanya sering dipakai bersama minmax(), tetapi hasilnya beda.
auto-fit cenderung merapatkan track kosongauto-fill cenderung mempertahankan slot yang tersediaKalau tujuanmu kartu mengisi ruang secara natural, auto-fit biasanya lebih sering dipilih.
grid-template-areas bagus untuk struktur yang jelas, tetapi bisa jadi sulit dirawat kalau terlalu detail.
Tanda layout mulai terlalu rumit:
Kalau yang dibutuhkan hanya ikon, teks, dan tombol dalam satu baris, Flexbox biasanya lebih ringan.
Grid tetap bisa dipakai, tetapi sering terasa berlebihan.
Grid mengatur ruang, tetapi bukan berarti isi di dalam item otomatis aman.
Perhatikan:
min-width bawaanSalah satu jebakan paling umum adalah kolom 1fr yang tidak mau mengecil karena ada konten anak yang memaksa lebar minimum.
minmax(0, 1fr) saat konten bisa memaksa overflow.content {
min-width: 0;
}
.layout {
display: grid;
grid-template-columns: 280px minmax(0, 1fr);
}Ini penting ketika konten utama berisi teks panjang, tabel, atau komponen yang lebar intrinsiknya besar.
Kalau spacing adalah bagian dari struktur layout, gunakan gap.
Kalau semua item diberi grid-column dan grid-row, Grid kehilangan sebagian manfaat auto placement.
Kalau layout Grid terasa salah, cek urutan berikut:
display: grid?gap membuat ruang tampak berbeda dari yang diduga?minmax() sudah dipakai di tempat yang tepat?Kalau kamu membaca Grid dengan cara ini, debugging biasanya lebih cepat karena masalahnya jadi kelihatan sebagai salah satu dari tiga hal:
Pilih Grid kalau kamu memikirkan:
Pilih Flexbox kalau kamu memikirkan: