Lebih dari separuh trafik web global datang dari ponsel. Website yang hanya nyaman di layar laptop kehilangan banyak pengunjung dan juga diberi peringkat lebih rendah oleh mesin pencari. Desain responsif membuat satu kode HTML/CSS beradaptasi dengan layar apa pun, dari ponsel kecil hingga monitor lebar.
Fondasi: tag viewport
Tanpa baris ini, browser ponsel menampilkan halaman seolah layar selebar ±980px lalu mengecilkannya:
<meta name="viewport" content="width=device-width, initial-scale=1">
Letakkan di <head> setiap halaman. Hindari user-scalable=no karena menghalangi pengguna memperbesar tampilan (masalah aksesibilitas).
Pendekatan mobile-first
Tulis CSS dasar untuk layar kecil, lalu tambahkan gaya untuk layar lebih besar dengan min-width.
/* Dasar: ponsel */
.container { padding: 16px; }
.kartu-grid { display: grid; gap: 16px; }
/* Tablet ke atas */
@media (min-width: 768px) {
.kartu-grid { grid-template-columns: repeat(2, 1fr); }
}
/* Desktop */
@media (min-width: 1100px) {
.container { max-width: 1100px; margin-inline: auto; }
.kartu-grid { grid-template-columns: repeat(3, 1fr); }
}
Keuntungannya: perangkat lemah di jaringan lambat hanya memuat gaya yang dibutuhkan, dan CSS cenderung lebih sederhana karena tidak perlu "membatalkan" gaya desktop.
Tentukan breakpoint dari konten, bukan dari perangkat. Perkecil jendela browser; ketika tata letak mulai terlihat janggal, di situlah breakpoint dibuat. Titik yang umum dipakai: 480, 768, 1024, 1280px.
Unit relatif
| Unit | Relatif terhadap | Dipakai untuk |
|---|---|---|
% | Ukuran elemen induk | Lebar kolom |
rem | Ukuran font akar (biasanya 16px) | Font, jarak, ukuran komponen |
em | Ukuran font elemen itu | Padding yang ikut ukuran teks |
vw / vh | Lebar / tinggi viewport | Elemen layar penuh |
ch | Lebar karakter "0" | Lebar baris teks (max-width: 65ch) |
Hindari px untuk ukuran teks; rem menghormati pengaturan ukuran font pengguna.
Flexbox dan Grid
Flexbox untuk tata letak satu dimensi (baris atau kolom): navigasi, deretan tombol, kartu sejajar.
.nav { display: flex; flex-wrap: wrap; gap: 12px; justify-content: space-between; }
CSS Grid untuk dua dimensi. Satu baris ajaib untuk galeri responsif tanpa media query:
.galeri {
display: grid;
gap: 16px;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}
Artinya: buat kolom sebanyak yang muat, minimal 240px, dan bagi sisa ruang rata.
Gambar yang responsif
Pastikan gambar tidak keluar dari wadahnya:
img { max-width: 100%; height: auto; display: block; }
Kirim ukuran yang sesuai agar ponsel tidak mengunduh gambar 3MB:
<img src="foto-800.jpg"
srcset="foto-400.jpg 400w, foto-800.jpg 800w, foto-1600.jpg 1600w"
sizes="(min-width: 768px) 50vw, 100vw"
alt="Peserta workshop sedang belajar"
loading="lazy" width="800" height="533">
srcset+sizes: browser memilih berkas terbaik.loading="lazy": gambar di bawah layar dimuat belakangan.widthdanheight: mencegah halaman melompat saat gambar tampil (layout shift).- Pertimbangkan format modern WebP/AVIF dan elemen
<picture>untuk art direction. - Gunakan
object-fit: coveruntuk menjaga rasio gambar di dalam kotak.
Tipografi yang luwes
clamp(min, ideal, max) membuat ukuran font tumbuh mulus mengikuti layar:
h1 { font-size: clamp(1.75rem, 4vw + 1rem, 3rem); }
body { font-size: 1rem; line-height: 1.6; }
.artikel { max-width: 65ch; } /* baris ideal 45-75 karakter */
Navigasi di layar kecil
Menu horizontal yang panjang tidak muat di ponsel. Pola umum: menu "hamburger" yang membuka panel. Pastikan:
- tombol memiliki label aksesibel (
aria-label="Buka menu") dan statusaria-expanded; - bisa dioperasikan dengan keyboard;
- menu tertutup ketika tautan dipilih.
Target sentuh dan interaksi
- Ukuran minimal area sentuh ±44×44 px, dengan jarak antar-tombol yang cukup.
- Jangan mengandalkan
:hoveruntuk fungsi penting, karena layar sentuh tidak punya hover. - Form: gunakan
typeinput yang tepat (email,tel,number) agar keyboard ponsel menyesuaikan, dan beriautocompleteyang benar. - Ukuran font input minimal 16px agar iOS tidak otomatis memperbesar halaman saat fokus.
Tabel dan konten lebar
Bungkus tabel lebar agar bisa digulir horizontal, alih-alih merusak tata letak halaman:
.tabel-wrap { overflow-x: auto; }
Untuk teks panjang tanpa spasi (URL), tambahkan overflow-wrap: anywhere;.
Preferensi pengguna
@media (prefers-color-scheme: dark) { /* tema gelap */ }
@media (prefers-reduced-motion: reduce) { * { animation: none !important; } }
Menghormati preferensi ini meningkatkan kenyamanan dan aksesibilitas.
Performa adalah bagian dari responsif
Ponsel di jaringan seluler butuh halaman ringan:
- Kompres dan ubah ukuran gambar.
- Minify CSS/JS, dan muat JS non-kritis dengan
defer. - Batasi font web (cukup 1-2 keluarga, gunakan
font-display: swap). - Targetkan Core Web Vitals yang baik: LCP < 2,5 detik, CLS < 0,1, INP < 200 ms.
Cara menguji
- DevTools → Device Toolbar (Ctrl/Cmd+Shift+M): simulasi berbagai ukuran layar dan throttling jaringan.
- Ubah ukuran jendela perlahan dan cari titik rusak.
- Uji di perangkat sungguhan, minimal satu Android dan satu iPhone jika memungkinkan.
- Lighthouse (di DevTools) untuk skor performa, aksesibilitas, dan SEO.
- Uji orientasi portrait dan landscape, serta zoom teks 200%.
Kesalahan yang sering terjadi
| Kesalahan | Perbaikan |
|---|---|
| Lupa meta viewport | Tambahkan di <head> |
Lebar tetap dalam px pada kontainer | Gunakan max-width dan persentase |
| Gambar meluap | max-width: 100%; height: auto |
| Teks terlalu kecil di ponsel | Basis 16px, gunakan rem |
| Tombol terlalu kecil/rapat | Minimal 44px |
| Menyembunyikan konten penting di mobile | Prioritaskan, jangan buang |
| Hanya menguji di emulator | Coba perangkat asli |
Kesimpulan
Website responsif dibangun dari beberapa kebiasaan sederhana: meta viewport, mobile-first, unit relatif, Flexbox/Grid, gambar yang adaptif, target sentuh yang nyaman, dan pengujian di perangkat nyata. Terapkan sejak awal proyek; mengubah desain desktop menjadi responsif belakangan jauh lebih sulit.
Komentar (0)
Masuk / Daftar