Layout baru yang dibangun dengan CSS Subgrid
(joshwcomeau.com)- CSS Subgrid adalah fitur yang melampaui batasan Grid lama dengan memungkinkan struktur grid induk diperluas hingga ke elemen DOM turunan
- Sebelumnya, hanya anak langsung yang bisa berpartisipasi dalam grid, tetapi dengan subgrid, struktur bertingkat seperti `` dan `
- ` juga bisa memakai penempatan sel grid yang sama
- Ini membantu mengatasi ketidakseimbangan antar elemen saudara akibat perbedaan panjang konten, sekaligus mendukung susunan layout yang membuat tiap kartu atau seksi merespons secara dinamis
- Namun, ada hal yang perlu diperhatikan seperti masalah reservasi baris, penomoran ulang garis, dan ketidakcocokan dengan fluid grid berbasis auto-fill
- Sudah didukung di browser utama, dan karena bisa diadopsi secara bertahap, teknologi ini berpotensi besar meningkatkan fleksibilitas desain UI ke depan
Konsep dasar Subgrid
- Pada CSS Grid awal, hanya elemen anak langsung yang bisa ikut dalam layout
- Sebagai contoh, pada UI portofolio, gambar `
- ` di dalam `` pada dasarnya terikat dalam satu sel
- Dengan
grid-template-rows: subgriddangrid-template-columns: subgrid, definisi baris dan kolom dari grid induk bisa diwariskan- Tiap `
- ` bisa ditempatkan langsung ke sel grid induk sehingga struktur HTML yang semantik dan perataan visual tetap terjaga sekaligus
- Hasil yang sama juga bisa dibuat dengan Flexbox dan Grid bertingkat, tetapi subgrid menawarkan pendekatan yang lebih ringkas lewat berbagi satu struktur grid yang sama
Kemungkinan layout baru
- Pada contoh kartu portofolio, tiap `` memiliki grid 2 kolom untuk menempatkan gambar dan teks
- Unit
frbersifat fleksibel, tetapi karena tiap kartu menghitung secara independen, bisa muncul ketidakseimbangan lebar kolom
- Unit
- Jika
grid-template-columns: subgridditerapkan, rasio kolom grid induk akan dibagikan ke semua kartu- Saat konten seperti panjang judul berubah, seluruh grid akan menyesuaikan ulang secara otomatis
- Dengan cara ini, kita bisa membangun layout yang saling menyadari antar elemen saudara
- Contoh: jika judul “Infinite Supercomputer” dipendekkan, rasio gambar dan teks di seluruh kartu akan langsung ikut menyesuaikan
Hal yang perlu diperhatikan saat memakai Subgrid (Gotchas)
Reservasi ruang baris
- Berbagi kolom terasa intuitif, tetapi saat berbagi baris, perlu reservasi baris secara eksplisit
- Contoh: pada kartu tabel harga, agar item di tiap `` sejajar pada baris yang sama, jumlah baris perlu ditentukan dengan
grid-row: span N
- Contoh: pada kartu tabel harga, agar item di tiap `` sejajar pada baris yang sama, jumlah baris perlu ditentukan dengan
- Secara default, subgrid hanya menempati satu sel, jadi jika ingin memakai beberapa baris, area grid induk harus diperluas terlebih dahulu
Penomoran grid bertingkat
- Subgrid mewarisi template baris dan kolom dari induk, tetapi nomor garis akan diatur ulang
- Misalnya, meski mewarisi garis 2 sampai 5 dari induk, di dalamnya tetap akan dinomori ulang menjadi 1 sampai 4
- Karena tiap grid punya indeksnya sendiri, nomor garis tidak bertindak sebagai ID unik, melainkan indeks relatif
Ketidakcocokan dengan fluid grid
- Fluid grid berbentuk
repeat(auto-fill, minmax())tidak bisa dipakai bersama subgrid- Subgrid membutuhkan jumlah kolom yang sudah ditentukan, dan tidak mendukung
auto-fillmaupunauto-fit - Penulis menyebutkan bahwa ia belum menemukan solusi untuk kombinasi tersebut
- Subgrid membutuhkan jumlah kolom yang sudah ditentukan, dan tidak mendukung
Dukungan browser lama
- Sudah didukung browser utama sejak 2023, tetapi tingkat dukungannya masih di bawah 90%
- Dengan kondisi
@supports not (grid-template-columns: subgrid), kita bisa menyediakan layout pengganti- Contoh: mengusulkan struktur fallback yang menempatkan gambar dan teks dalam tumpukan vertikal
Contoh nyata dan kesimpulan
- Situs pengembang Stripe (stripe.dev) menyusun seluruh halaman sebagai satu grid besar, lalu memakai beberapa lapisan subgrid untuk penempatan yang rinci
- Subgrid berguna bukan hanya untuk layout skala besar, tetapi juga penyesuaian UI skala kecil
- Bisa diadopsi secara bertahap tanpa perlu merombak seluruh proyek
- Sebagai sarana baru untuk memperoleh fleksibilitas layout CSS, subgrid punya nilai tinggi untuk dieksplorasi secara eksperimental
1 komentar
Komentar Hacker News
Fitur subgrid memang sangat keren, tetapi pada contoh sederhana pertama, anak-anak juga bisa dibuat ikut dalam layout grid dengan
ul { display: contents }Jika fitur subgrid tidak benar-benar diperlukan, cara ini lebih efisien
display: contentsmenghapus elemen UL sepenuhnya dari layoutJadi Anda tidak bisa menerapkan style atau menerima event UI pada elemen tersebut
Jika ingin memakai UL sebagai area highlight atau bagian yang bisa di-scroll, subgrid jauh lebih berguna
fr, lalu pakaifruntuk teks agar mengisi sisa ruangDulu saya benar-benar kesulitan karena tidak ada subgrid saat membuat UI perbandingan harga
Menempatkan dua tabel berdampingan dan menyelaraskan barisnya itu mustahil
Memang bisa diakali dengan tinggi tetap atau perhitungan JS, tetapi dalam struktur komponen React itu sangat tidak efisien
Saya sempat berpikir apakah container queries bukan solusi yang lebih baik
Tetapi untuk menjaga konsistensi seluruh grid, subgrid mungkin lebih cocok
Sebagai referensi, contoh CodePen membuatnya lebih mudah dipahami
Selain itu, memakai container menciptakan stacking context baru sehingga merepotkan
Sayang sekali subgrid dan container tidak bisa dipakai bersama. Jika anak bisa merujuk ukuran subgrid, hasilnya akan sangat kuat
Muncul pikiran, “Jadi pada akhirnya kita kembali ke layout <table>?”
Sistem Grid adalah alat untuk penataan visual, bukan tabel yang merepresentasikan struktur data
Sekarang grid sudah menjadi standar, jadi saya berharap kita tidak terus membandingkannya dengan tabel
Tetapi desain responsif maupun aksesibilitas sama sekali tidak dipertimbangkan. Pada akhirnya kita seperti menemukan kembali tabel
Pada akhirnya CSS hanya mengimplementasikan kembali fungsi itu dalam bentuk yang lebih baik
Salah satu bug grid yang pernah saya alami adalah ketika elemen
<img>diberi ukuran dalam persen, ukuran sel jadi terdistorsi ke ukuran asli gambarItu terjadi baik di Firefox maupun Chromium, dan bug terkait ada di Mozilla Bug 1857365
Agak disayangkan bahwa CSS kadang perlu menambahkan informasi struktur dokumen demi layout
Misalnya, harus secara eksplisit menyebutkan jumlah baris
Atau jika satu kontainer flex bisa meniru distribusi kontainer lain
Tetapi jika begitu, kemungkinan DX akan menjadi rumit
Saya penasaran kenapa pada contoh kode ada style di file HTML dan CSS sekaligus
Hanya dengan melihat CSS pada contoh subgrid pertama, saya lama mencari style apa yang diterapkan ke UL
Muncul pikiran, “Jadi pada akhirnya kita kembali ke grid lagi?”
Hal serupa juga pernah dilakukan pada era HTML dulu
Tulisan blog Josh selalu mengagumkan
Kejelasan tulisannya, selera desainnya, sampai situs web yang interaktif, semuanya luar biasa
Secara pribadi, grid masih terasa tidak nyaman digunakan
Sintaksnya terasa canggung dan naluri layout saya juga kurang cocok. Flexbox jauh lebih intuitif dan fleksibel
Flexbox berpusat pada konten, sedangkan Grid mengontrol ukuran dengan pendekatan berpusat pada kontainer
Konten tidak otomatis menyesuaikan di beberapa sumbu, dan semua harus ditempatkan secara manual
Mungkin saya belum benar-benar memahami esensi grid, atau memang kurang cocok dengan jenis pekerjaan saya