Proses pertama yang harus dilakukan dalam membuat desain halaman website yaitu menentukan layoutnya.
Sayangnya, proses inilah yang biasanya paling banyak menyita waktu karena tingkat kesulitannya cukup tinggi.
Tapi itu dulu…
Di era tahun 90an.
Waktu itu, untuk membuat layout halaman website masih menggunakan teknik CSS tabel dengan dibantu image slicing tools seperti Fireworks.
Saat ini dunia terus berubah.
Fitur CSS juga terus berkembang.
Sekarang sudah ada beberapa teknik yang bisa dilakukan untuk menentukan layout halaman website.
Mulai dari teknik CSS table (cara jadul), CSS property float dan clearfix, CSS Flexbox, dan yang paling baru yaitu CSS Grid.
Semakin baru fiturnya, semakin memudahkan kita untuk mengatur tata letak elemen website.
Jadi bagi kamu yang baru belajar CSS, tidak ada salahnya untuk langsung mempelajari teknik membuat layout dengan CSS Grid ini.
Dan saya akan membahasnya secara detail dalam artikel ini.
Yuk baca sampai selesai…
Apa itu CSS Grid Layout?
CSS Grid Layout adalah fitur terbaru dari CSS3 yang digunakan untuk mengatur sistem tata letak elemen HTML.
Grid layout memiliki sistem 2 dimensi sehingga dapat menangani kolom dan baris.
Tidak seperti CSS Flexbox yang sebagian besar merupakan sistem 1 dimensi.
Dengan menentukan CSS Grid pada elemen induk (sebagai grid container), otomatis elemen anak akan menjadi item grid (grid items).
CSS Grid telah mengubah cara kita dalam mengatur tata letak elemen menjadi lebih mudah.
Sebelum adanya fitur ini, untuk mengatur tata letak elemen (misalnya menengahkan elemen secara vertikal) harus menggunakan teknik float atau positioning yang cukup ribet dan kadang perlu teknik hack CSS.
Kemudian datang fitur flexbox yang bisa memecahkan masalah tersebut. Tapi masih menyisakan sedikit masalah dalam hal pengaturan baris elemen.
Dan akhirnya, fitur grid layout ini datang untuk menyelesaikan semua masalah sebelumnya.
Dasar CSS Grid Layout
Untuk mulai menggunakan CSS Grid, kamu harus menentukan elemen container sebagai grid dengan display: grid.
Kemudian tentukan ukuran kolom dan baris dengan grid-template-columns dan grid-template-rows.
Setelah itu, tambahkan grid-column dan grid-row pada elemen anak sebagai grid item.
Terminology CSS Grid
Sebelum mendalami konsep Grid, kamu harus memahami dulu terminologinya.
Karena ada beberapa istilah dalam CSS grid ini yang semua konsepnya hampir sama.
Sehingga kamu harus menghafalnya seperti yang didefinisikan oleh spesifikasi Grid.
Grid Container
Grid container adalah elemen yang ditentukan dengan display: grid dan dijadikan induk dari semua item grid.
Pada contoh ini, <div class="container"> adalah grid container.
<div class="container">
<div class="item item-1"></div>
<div class="item item-2"></div>
<div class="item item-3"></div>
</div>
Grid Item
Grid Item adalah semua elemen anak pertama dari grid container.
Pada contoh berikut, semua <div class="item"> adalah grid item.
Tetapi <p class="sub-item"> bukanlah grid item karena sebagai anak kedua.
<div class="container">
<div class="item"></div>
<div class="item">
<p class="sub-item"></p>
</div>
<div class="item"></div>
</div>
Grid Line
Grid line adalah garis pemisah yang membentuk struktur grid.
Garis ini berupa garis vertikal (“column grid lines”) dan juga garis horizontal (“row grid lines”) yang berada di kedua sisi baris dan kolom.
Garis ini bisa dilihat secara real pada browser Chrome dengan cara klik kanan > klik inspeksi > pada tab elements, arahkan kursor pada elemen grid container.
Garis berwarna orange itulah yang disebut dengan grid lines.
Grid Track
Grid track adalah ruang antara dua garis grid yang berdekatan.
Atau bisa disebut sebagai kolom atau baris grid.
Pada contoh berikut, grid track ada diantara garis grid kedua dan ketiga yang saya beri warna orange.
Grid Cell
Grid Cell adalah ruang antara dua garis grid kolom (“column”) dan garis grid baris (“row”) yang berdekatan.
Grid cell ini merupakan satu “unit” dari grid.
Pada contoh berikut, grid cell ada di antara garis grid baris 1 dan 2, dan garis grid kolom 2 dan 3.
Grid Area
Grid Area adalah total ruang dari beberapa grid cell yang telah ditentukan sebelumnya.
Pada contoh berikut, grid area terdiri dari 4 grid cell yang ada di antara garis grid baris 1 dan 3, dan garis grid kolom 1 dan 3.
Membuat Grid Container
Grid Container dibuat dengan cara menambahkan properti CSS display:grid atau display: inline-grid pada elemen.
Semua elemen anak pertama dari grid container ini akan menjadi item grid (grid items).
Display Grid
display: grid digunakan untuk menentukan elemen sebagai container level-block.
Grid item ditempatkan pada baris (rows) secara default dan menjangkau lebar penuh dari grid container.
.container {
display: grid;
}
Display Inline Grid
display: inline-grid digunakan untuk menentukan elemen sebagai container level-inline.
.container {
display: grid;
}
Explicit Grid
Secara eksplisit mengatur grid dengan membuat kolom (“columns”) dan baris (“rows”) dengan properti grid-template-columns dan grid-template-rows.
grid-template-columns
Menentukan kolom (“column”) grid dengan cara menambahkan beberapa nilai yang dipisahkan oleh spasi.
Nilai tersebut menunjukkan ukuran grid track, dan spasi diantara nilai-nilai itu menunjukkan grid line.
Nilai atau value:
<track-size>- bisa berupa length (dengan unit px, em, rem, dll), persen, atau sebagian kecil dari ruang kosong di grid (menggunakan unitfr).<line-name>- bisa kamu beri nama sesukamu.
.container {
grid-template-columns: <track-size> ... | <line-name> <track-size> ...;
}
grid-template-rows
Menentukan baris (“row”) grid dengan cara menambahkan beberapa nilai yang dipisahkan oleh spasi.
Nilai tersebut menunjukkan ukuran grid track, dan spasi diantara nilai-nilai itu menunjukkan grid line.
Nilai atau value:
<track-size>- bisa berupa length (dengan unit px, em, rem, dll), persen, atau sebagian kecil dari ruang kosong di grid (menggunakan unitfr).<line-name>- bisa kamu beri nama sesukamu.
.container {
grid-template-rows: <track-size> ... | <line-name> <track-size> ...;
}
Contoh:
Saat kamu meninggalkan ruang kosong di antara nilai track, garis grid secara otomatis diberi angka positif dan negatif:
.container {
grid-template-columns: 40px 50px auto 50px 40px;
grid-template-rows: 25% 100px auto;
}
Tetapi kamu juga bisa memilih untuk memberi nama garis secara eksplisit menggunakan syntax bracket seperti berikut:
.container {
grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];
grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];
}
Garis grid juga bisa memiliki lebih dari satu nama.
Contoh, pada garis kedua berikut memiliki dua nama: row1-end dan row2-start:
.container {
grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end];
}
Jika definisi kamu berisi bagian berulang, kamu dapat menggunakan notasi repeat() untuk merampingkan kode:
.container {
grid-template-columns: repeat(3, 20px [col-start]);
}
Yang sama dengan kode berikut:
.container {
grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start];
}
Jika beberapa baris memiliki nama yang sama, mereka dapat direferensikan dengan nama dan jumlah baris mereka.
.item {
grid-column-start: col-start 2;
}
Unit fr memungkinkan kamu untuk mengatur ukuran track sebagai sebagian kecil dari ruang kosong grid container.
Misalnya, untuk mengatur setiap item menjadi sepertiga lebar grid container, ini kodenya:
.container {
grid-template-columns: 1fr 1fr 1fr;
}
Ruang kosong dihitung setelah item yang tidak fleksibel.
Pada contoh berikut, jumlah total ruang kosong yang tersedia untuk unit fr tidak termasuk 50px.
.container {
grid-template-columns: 1fr 50px 1fr 1fr;
}
grid-template-rows: 50px 100px
Track baris dibuat untuk setiap nilai yang ditentukan dengan grid-template-rows. Nilai ukuran track dapat berupa nilai panjang selain negatif (px, %, em, dll).
Item grid 1 dan 2 memiliki ketinggian tetap 50px dan 100px.
Karena hanya 2 track baris yang ditentukan, ketinggian item 3 dan 4 ditentukan oleh konten masing-masing.
grid-template-columns: 90px 50px 120px
Seperti baris, track kolom dibuat untuk setiap nilai yang ditentukan dengan grid-template-columns.
Item grid 4, 5 dan 6 ditempatkan pada track baris baru karena hanya 3 ukuran track column yang ditentukan.
Dan karena mereka ditempatkan di track column 1, 2 dan 3, ukuran kolom mereka sama dengan item 1, 2 dan 3.
Item grid 1, 2 dan 3 memiliki lebar tetap masing-masing 90px, 50px, dan 120px.
grid-template-columns: 1fr 1fr 2fr
Unit fr bisa digunakan untuk membuat track grid yang fleksibel. Unit ini mewakili sebagian kecil dari ruang yang tersedia dalam grid container (seperti pada flexbox).
Pada contoh ini, item 1 dan 2 mengambil dua (empat) bagian pertama, sedangkan item 3 mengambil dua yang terakhir.
grid-template-columns: 3rem 25% 1fr 2fr
fr dihitung berdasarkan ruang yang tersisa bila dikombinasikan dengan nilai panjang lainnya.
Dalam contoh ini, 3rem dan 25% akan dikurangi dari ruang yang tersedia sebelum ukuran fr dihitung:
1fr = ((lebar kisi) - (3rem) - (25% dari lebar kisi)) / 3
Ukuran Minimum dan Maksimum Grid Track
minmax().grid-template-rows: minmax(100px, auto);
grid-template-columns: minmax(auto, 50%) 1fr 3em;
Fungsi minmax() menerima 2 argumen: yang pertama adalah ukuran minimun track dan yang kedua adalah ukuran maksimum track.
Selain nilai panjang (px, em,rem, dll), juga bisa diberi nilai otomatis (auto) yang memungkinkan track meregang/melebar berdasarkan ukuran konten.
Dalam contoh ini, track baris pertama diatur untuk memiliki ketinggian minimum 100px, tetapi ukuran maksimum otomatisnya akan memungkinkan track baris meregang jika kontennya lebih tinggi dari 100px.
Track kolom pertama memiliki ukuran minimum otomatis, tetapi ukuran maksimum 50% akan mencegahnya tidak lebih lebar dari 50% dari lebar grid container.
Grid Track Berulang
repeat().grid-template-rows: repeat(4, 100px);
grid-template-columns: repeat(3, 1fr);
Notasi repeat() menerima 2 argumen: yang pertama menunjukkan berapa kali track harus diulang, dan yang kedua menunjukkan definisi track (bisa diberi nilai panjang).
grid-template-columns: 30px repeat(3, 1fr) 30px
repeat() juga dapat digunakan dalam daftar track.
Dalam contoh ini, track kolom pertama dan terakhir memiliki lebar 30px, dan 3 kolom track di antaranya, dibuat oleh repeat() yang masing-masing memiliki lebar 1fr.
Grid Gaps (Gutter)
Properti grid-gap merupakan kependekan dari grid-row-gap dan grid-column-gap.
Properti ini digunakan untuk membuat jarak antar kolom dan baris.
Values:
<grid-row-gap> <grid-column-gap> - nilai panjang
.container {
grid-gap: <grid-row-gap> <grid-column-gap>;
}
Contoh:
.container {
grid-template-columns: 100px 50px 100px;
grid-template-rows: 80px auto 80px;
grid-gap: 15px 10px;
}
Jika grid-row-gap tidak ditentukan, maka akan digunakan nilai yang sama dengan grid-column-grid.
Catatan: awalan grid- akan dihapus dan grid-gap diubah namanya menjadi gap. Properti tanpa awan grid- sudah didukung di Chrome 68+, Safari 11.2 rilis 50+ dan Opera 54+.
grid-column-gap
&
grid-row-gap
Menentukan ukuran garis grid. Caranya seperti mengatur lebar gutter (celah) di antara kolom atau baris.
Values:
<line-size> - nilai panjang (px, em, rem, dll)
.container {
grid-column-gap: <line-size>;
grid-row-gap: <line-size>;
}
Contoh:
.container {
grid-template-columns: 100px 50px 100px;
grid-template-rows: 80px auto 80px;
grid-column-gap: 10px;
grid-row-gap: 15px;
}
Gutter (celah) hanya dibuat di antara kolom atau baris, bukan di tepi luar grid.
grid-row-gap: 24px;
grid-column-gap: 5rem;
Nilai ukuran gap bisa berupa angka panjang (px, %, em, dll) selain negatif.
.container {
grid-template-columns: repeat(2,minmax(0,1fr));
grid-row-gap: 24px;
grid-column-gap: 5rem;
}
grid-gap: 100px 1em
grid-gap merupakan kependekan dari grid-row-gap dan grid-column-gap.
Jika 2 nilai didefinisikan, yang pertama menunjukkan grid-row-gap dan yang kedua grid-column-gap.
.container {
grid-template-columns: repeat(2,minmax(0,1fr));
grid-gap: 100px 1em
}
grid-gap: 2rem
Jika hanya satu nilai yang ditentukan, maka celah (gap) baris dan kolom akan sama.
.container {
grid-template-columns: repeat(2,minmax(0,1fr));
grid-gap: 2rem;
}
Mengatur Posisi Item berdasarkan Angka Grid Line
Grid Line atau garis grid merupakan garis yang mewakili awal, akhir, atau antara track kolom dan baris.
Setiap garis, mulai dari awal lintasan ke arah grid, diberi nomor secara bertahap mulai dari 1.
grid-column-start
grid-column-end
grid-row-start
grid-row-end
Properti ini digunakan untuk menentukan lokasi item grid di dalam grid container dengan merujuk ke garis grid tertentu.
grid-column-start/grid-row-start merupakan garis tempat item dimulai.
Sedangkan grid-column-end/grid-row-end merupakan garis di mana item berakhir.
Nilai:
<line>- bisa berupa angka untuk merujuk ke garis grid bernomor, atau nama untuk merujuk ke garis grid bernamaspan <number>- item akan membentang melintasi jumlah track grid yang disediakanspan <name>- item akan membentang sampai menyentuh baris berikutnya dengan nama yang disediakanauto- menunjukkan penempatan otomatis, rentang otomatis, atau rentang default
.item {
grid-column-start: <number> | <name> | span <number> | span <name> | auto;
grid-column-end: <number> | <name> | span <number> | span <name> | auto;
grid-row-start: <number> | <name> | span <number> | span <name> | auto;
grid-row-end: <number> | <name> | span <number> | span <name> | auto;
}
Contoh:
.item-a {
grid-column-start: 2;
grid-column-end: five;
grid-row-start: row1-start;
grid-row-end: 3;
}
.item-b {
grid-column-start: 1;
grid-column-end: span col4-start;
grid-row-start: 2;
grid-row-end: span 2;
}
Jika tidak ada grid-column-end / grid-row-end yang dideklarasikan, item akan membentang 1 track secara default.
Item grid bisa saling tumpang tindih. Sehingga kamu dapat menggunakan z-index untuk mengontrol urutan susunannya.
grid-row-start: 2;
grid-row-end: 3;
grid-column-start: 2;
grid-column-end: 3;
Item grid 1 (warna pink) dimulai dari garis row 2 dan diakhiri pada garis row 3, dan dimulai dari garis column 2 dan diakhiri pada garis column 3.
Jika item hanya mencakup satu baris atau kolom, grid-row/column-end` tidak diperlukan.
.container {
grid-template-columns: repeat(2,minmax(0,1fr));
}
.item-1 {
grid-row-start: 2;
grid-row-end: 3;
grid-column-start: 2;
grid-column-end: 3;
}
grid-row: 2;
grid-column: 3 / 4;
grid-row merupakan singkatan untuk grid-row-start dan grid-row-end.
Dan grid-column merupakan singkatan untuk grid-column-start dan grid-column-end.
Jika satu nilai didefinisikan, maka akan menunjukkan grid-row/column-start.
Jika dua nilai didefinisikan, nilai pertama menentukan grid-row/column-start dan yang kedua menentukan grid-row/column-end, dan harus dipisah oleh tanda garis miring (/).
.container {
grid-template-columns: repeat(3,minmax(0,1fr));
}
.item-1 {
grid-row: 2;
grid-column: 3 / 4;
}
grid-area: 2 / 2 / 3 / 3
grid-area merupakan kependekan untuk grid-row-start, grid-column-start, grid-row-end dan grid-column-end.
Jika 4 nilai didefinisikan, yang pertama menunjukkan grid-row-start, yang kedua grid-column-start, yang ketiga grid-row-end dan yang keempat grid-column-end.
.container {
grid-template-columns: repeat(3,minmax(0,1fr));
}
.item-1 {
grid-area: 2 / 2 / 3 / 3
}