Menguasai CSS modern untuk layout dan responsif: custom properties, Flexbox untuk satu dimensi, Grid untuk dua dimensi, unit modern seperti clamp dan fr, serta pola mobile-first dengan media queries — diterapkan pada katalog TokoKita

Setelah di episode 3 kita menyusun struktur semantik TokoKita, kini saatnya memberi tampilan: CSS modern. Istilah "modern" penting — CSS yang kita pakai sekarang jauh berbeda dari CSS 2010-an. Flexbox, Grid, dan custom properties membuat layout yang dulu butuh library (Bootstrap) kini bisa ditulis langsung dengan CSS murni yang lebih kecil, lebih cepat, dan lebih mudah dipahami.
Mengapa episode ini krusial? Karena responsif bukan lagi "fitur bonus" — sebagian besar pengguna Indonesia mengakses web lewat HP. Layout yang tidak responsif berarti kehilangan mayoritas pengguna. Di sini kalian juga mulai melatih "mata desain" untuk episode 10 (styling & utility CSS).
Custom properties (--var) adalah cara menyimpan nilai desain agar konsisten dan mudah diubah:
:root {
--color-bg: #fafaf9;
--color-text: #1c1917;
--color-primary: #b45309;
--space-sm: 0.5rem;
--space-md: 1rem;
--space-lg: 2rem;
--radius: 0.5rem;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}Konsep ini adalah cikal bakal design tokens yang akan kita bahas di episode 10 dan 25: satu tempat untuk semua keputusan desain, dan seluruh komponen membaca dari sana.
Flexbox bekerja pada satu sumbu (baris atau kolom). Contoh paling umum: baris navigasi dan tombol.
nav {
display: flex;
justify-content: space-between;
align-items: center;
gap: var(--space-md);
}Empat properti yang paling sering dipakai: justify-content (posisi sumbu utama), align-items (sumbu silang), gap (jarak antar item — tanpa hack margin), dan flex-wrap.
Grid bekerja pada dua sumbu sekaligus (baris dan kolom) — tepat untuk katalog produk TokoKita:
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: var(--space-lg);
}repeat(auto-fill, minmax(220px, 1fr)) adalah pola emas: browser memutuskan berapa kolom yang muat, lalu membagi sisa ruang secara merata — tanpa satu media query pun. Ini yang membuat layout langsung responsif.
Tip
Aturan praktis memilih: satu sumbu (navbar, baris tombol) → Flexbox; dua sumbu (kartu, dashboard, galeri) → Grid. Memaksa salah satu untuk kasus yang lain biasanya menghasilkan layout yang kaku.
Tulis gaya dasar untuk layar kecil terlebih dahulu, lalu perkuat untuk layar lebih besar lewat min-width:
.product-card { padding: var(--space-md); }
@media (min-width: 640px) {
.product-card { padding: var(--space-lg); }
}Keuntungannya: baseline yang sederhana (cocok untuk HP lambat), dan logika tambahan hanya ditambahkan saat benar-benar dibutuhkan.
clamp() membuat ukuran responsif tanpa media query:
h1 {
font-size: clamp(1.5rem, 1rem + 2vw, 2.5rem);
}Artinya: minimal 1.5rem, tumbuh seiring vw, maksimal 2.5rem. Ukuran elemen tidak pernah "meledak" di layar besar dan tidak pernah terlalu kecil di HP.
Gabungkan semuanya pada halaman katalog:
<section class="product-grid" aria-label="Daftar produk">
<article class="product-card">
<img src="kopi.jpg" alt="Kemasan kopi arabika 250 gram" />
<h2 class="product-title">Kopi Arabika 250g</h2>
<p class="product-price">Rp85.000</p>
<button class="btn-add">Tambah ke keranjang</button>
</article>
</section>.product-card {
display: flex;
flex-direction: column;
gap: var(--space-sm);
background: var(--color-bg);
border-radius: var(--radius);
padding: var(--space-md);
}
.product-card img {
width: 100%;
aspect-ratio: 4 / 3;
object-fit: cover;
border-radius: var(--radius);
}
.btn-add {
margin-top: auto;
background: var(--color-primary);
color: #fff;
border: 0;
padding: var(--space-sm);
border-radius: var(--radius);
cursor: pointer;
}margin-top: auto mendorong tombol ke bawah sehingga semua kartu di satu baris punya tinggi tombol yang sejajar — trik kecil Flexbox yang sering dipakai.
| Kesalahan | Dampak | Perbaikan |
|---|---|---|
px kaku untuk ukuran besar | Tidak menyesuaikan | rem, clamp, %, fr |
Media query max-width untuk semua | Baseline desktop, adaptasi terlambat | Mobile-first (min-width) |
| Flexbox untuk grid penuh | Kolom tidak rata | Grid |
height dipaksakan | Konten terpotong | min-height + flex |
| Warna hardcode di mana-mana | Susah diubah tema | Custom properties |
Inti yang harus dibawa pulang:
gap menggantikan margin hack.repeat(auto-fill, minmax(220px, 1fr)) membuat grid responsif tanpa media query.min-width dan clamp().Di episode 5 selanjutnya kita akan menghidupkan halaman: JavaScript core — ES6+, manipulasi DOM, events, async (promises/async-await), dan modules, sampai membangun aplikasi vanilla JS untuk keranjang belanja TokoKita. Ini bahasa kedua kalian setelah HTML/CSS, dan fondasi mutlak sebelum TypeScript. Sampai jumpa di episode 5!