Grids & Containers — UI/UX

Grid System dan Container Grid adalah fondasi layout — kerangka tak terlihat yang menjaga elemen-elemen tetap teratur dan sejajar. Container Container…

Container adalah kotak yang membatasi lebar isi halaman, dan grid adalah kolom-kolom tak terlihat di dalamnya yang menentukan di mana tiap elemen berdiri. Bayangin lemari pajangan di toko kelontong: lemarinya punya lebar tetap (container), di dalamnya ada sekat-sekat yang sama lebar (kolom), dan di antara sekat ada papan pemisah (gutter). Barang besar makan dua atau tiga sekat, barang kecil cukup satu, tapi semuanya tetap lurus karena sekatnya sama.

🧪 Tebakan cepat: Halaman Homestay Kabut sekarang punya tiga kartu kamar di grid 12 kolom dengan jarak 24px, di dalam container 1200px. Tiap kartu memakai 4 kolom. Di layar laptop 1280px, satu kartu selebar berapa px? Jawabannya ada di bagian "Menghitung lebar kartu".

Tiga kartu kamar

Bu Sri sekarang punya tiga kamar, dan ketiganya tampil berjajar di halaman pesan:

Kamar Harga per malam Tamu
Kamar Teras Rp 350.000 2
Kamar Loteng Rp 275.000 2
Kamar Kebun Rp 425.000 4

Tanpa aturan apa pun, tiga kartu ini akan melebar sepanjang layar. Di monitor 1920px, satu kartu bisa selebar 600px lebih, dan mata harus menyeberang jauh untuk membandingkan harga. Dua alat membereskannya: container dan grid.

Container: batas lebar halaman

.container {
  max-width: 1200px;  /* isi paling lebar 1200px */
  margin: 0 auto;     /* sisa ruang dibagi rata kiri dan kanan */
  padding: 0 1.5rem;  /* 24px, supaya isi gak nempel ke tepi layar HP */
}

Hasilnya di empat lebar layar (contoh ini memakai body { margin: 0 }):

Layar Lebar isi container Ruang kosong di tiap sisi
375px (HP) 375 - 48 = 327px 24px padding
768px (tablet) 768 - 48 = 720px 24px padding
1280px (laptop) 1200px (1280 - 1248) / 2 = 16px, ditambah padding 24px = 40px
1920px (monitor) 1200px (1920 - 1248) / 2 = 336px, ditambah padding 24px = 360px

Website umum biasanya memakai container sekitar 1024 sampai 1280px; latihan ini memakai 1200px. Bootstrap 5, misalnya, memakai 1140px untuk layar 1200px ke atas dan 1320px untuk 1400px ke atas. Untuk halaman artikel yang isinya teks panjang, batasi lebar teksnya sekitar 65ch, seperti di pelajaran ukuran font.

Grid 12 kolom

Kenapa 12? Karena 12 habis dibagi 1, 2, 3, 4, 6, dan 12. Dari satu grid kamu bisa bikin 2 kolom sama lebar (6 + 6), 3 kolom (4 + 4 + 4), 4 kolom (3 + 3 + 3 + 3), atau konten dan sidebar (8 + 4). Grid 10 kolom gak bisa dibagi tiga dengan rata. Itu sebabnya grid 12 kolom dipakai Bootstrap dan banyak design system.

<div class="container">
  <div class="grid">
    <div class="card"><h2>Kamar Teras</h2><p>Rp 350.000 / malam</p></div>
    <div class="card"><h2>Kamar Loteng</h2><p>Rp 275.000 / malam</p></div>
    <div class="card"><h2>Kamar Kebun</h2><p>Rp 425.000 / malam</p></div>
  </div>
</div>

<style>
  .grid {
    display: grid;
    grid-template-columns: repeat(12, 1fr); /* 12 kolom sama lebar */
    gap: 1.5rem;                            /* gutter 24px */
  }
  .card { grid-column: span 4; } /* tiap kartu makan 4 dari 12 kolom */
</style>

Menghitung lebar kartu

Grid 12 kolom punya 11 gutter di antara kolomnya. Jadi:

Di laptop 1280px, isi container 1200px dan gap 24px:

Satu kartu selebar 384px. Itu jawaban tebakannya.

Bandingkan dengan repeat(3, 1fr), tiga kolom saja: (1200 - 2 × 24) / 3 = 1152 / 3 = 384px. Hasilnya sama persis. Jadi kalau isi grid-nya cuma kartu yang sama lebar, repeat(3, 1fr) adalah cara singkat menulis hal yang sama, dan latihan memakai cara singkat ini. Grid 12 kolom berguna begitu halamanmu mencampur lebar: deskripsi kamar span 8 di samping kotak pesan span 4.

Gutter dan layar kecil

Gutter yang umum diambil dari skala jarak: 16px untuk halaman padat, 24px untuk kebanyakan halaman, 32px untuk halaman yang lega. Yang penting satu nilai untuk seluruh halaman.

Masalah muncul di HP. Di layar 375px, isi container 327px, jadi kolom = (327 - 264) / 12 = 5,25px, dan kartu span 4 = 4 × 5,25 + 72 = 93px. "Rp 350.000 / malam" gak muat di situ. Di HP, biarkan tiap kartu memakai seluruh 12 kolom:

.card { grid-column: span 12; }      /* HP: 327px, satu kartu satu baris */

@media (min-width: 768px) {
  .card { grid-column: span 4; }     /* 768px ke atas: tiga kartu berjajar */
}

⚠️ Jebakan yang sering ketemu

TL;DR: Container membatasi lebar isi: max-width: 1200px (website umum 1024 sampai 1280px), margin: 0 auto untuk ke tengah, padding: 0 1.5rem supaya isi gak nempel ke tepi. Grid 12 kolom (display: grid; grid-template-columns: repeat(12, 1fr)) bisa dibagi 2, 3, 4, dan 6. Jarak antar kolom disebut gutter (gap), misalnya 24px. Lebar kolom = (lebar isi - 11 × gap) / 12, dan kartu span n = n × kolom + (n - 1) × gap: di 1280px, kolom 78px dan kartu span 4 jadi 384px, sama dengan repeat(3, 1fr). Di HP 375px span 4 cuma 93px, jadi pakai span 12 dan naikkan ke span 4 dengan @media (min-width: 768px).

Yang akan kamu pelajari