CSS Responsive Layout Media Queries Container Queries
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama CSS untuk melanjutkan topik lainnya.
Kembali ke rujukan utama CSS untuk melanjutkan topik lainnya.
Responsive layout adalah pendekatan CSS untuk membuat UI menyesuaikan ruang yang tersedia tanpa mengorbankan keterbacaan, konsistensi spacing, dan fungsi komponen.
Tiga alat yang paling sering dipakai adalah:
%, vw, rem, clamp(), min(), dan max()Banyak layout responsif gagal bukan karena CSS-nya salah, tetapi karena strategi responsifnya terlalu bergantung pada lebar layar.
Gejala yang sering muncul:
Kalau pendekatannya tepat, komponen jadi lebih tahan terhadap perubahan container, bukan cuma perubahan viewport.
Pendekatan yang paling aman biasanya bertingkat:
Media queries dipakai untuk mengubah style ketika kondisi tertentu terpenuhi.
Contoh paling umum adalah breakpoint berdasarkan lebar viewport:
.card-grid {
display: grid;
gap: 1rem;
grid-template-columns: 1fr;
}
@media (min-width: 768px) {
.card-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
Pakai breakpoint saat ada perubahan struktur yang sulit dicapai hanya dengan ukuran fluid.
Contoh yang tepat:
Jangan buru-buru menambah breakpoint kalau masalahnya cukup diselesaikan dengan nilai fluid.
Misalnya:
line-height, max-width, atau skala fontmax-width atau minmax()width: 100% dan height: autoclamp()min-widthFluid sizing membuat ukuran berubah secara bertahap mengikuti ruang yang tersedia.
Ini biasanya lebih stabil daripada langsung meloncat di breakpoint.
% untuk lebar relatif terhadap parentrem untuk skala yang konsisten dengan typographyvw untuk ukuran yang mengikuti viewportminmax() untuk grid track yang fleksibelclamp() untuk batas minimum, ideal, dan maksimummax-width dan min-width untuk menjaga batas aman.article {
max-width: 70ch;
padding-inline: clamp(1rem, 2vw, 2rem);
font-size: clamp(1rem, 0.95rem + 0.25vw,
Di sini:
max-width: 70ch menjaga panjang baris tetap nyaman dibacaclamp() membuat padding dan font size berubah halus.product-list {
display: grid;
gap: 1rem;
grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
}Pola ini sangat berguna karena grid otomatis menyesuaikan jumlah kolom sesuai ruang yang tersedia.
Kalau semua ukuran dikunci pada breakpoint, UI cenderung terasa patah-patah.
Fluid sizing membantu:
Container queries dipakai saat style komponen harus bergantung pada ukuran container tempat ia berada.
Ini penting karena komponen yang sama bisa tampil di:
Kalau hanya mengandalkan viewport, komponen bisa salah membaca konteks.
.card-shell {
container-type: inline-size;
}
.card {
display: grid;
gap: 0.75rem;
grid-template-columns: 1fr;
}
@container (min-width: 30rem) {
.card {
Gunakan container queries kalau:
Container queries bukan pengganti total media queries.
Media queries tetap cocok untuk:
Pola yang sering paling stabil:
Pertanyaan paling berguna bukan “berapa breakpoint yang harus dipakai?”, tapi “yang berubah itu halaman, komponen, atau ukurannya?”
Terlalu banyak breakpoint biasanya tanda bahwa layout dasar belum fluid.
Akibatnya:
Kalau kamu merasa perlu breakpoint tiap 100px, biasanya ada masalah pada struktur atau sizing dasar.
Ini jebakan paling umum.
Komponen yang bagus di desktop belum tentu bagus saat dipasang di area yang sempit. Kalau komponen selalu membaca viewport, ia akan salah konteks saat dipindah ke panel kecil.
Contoh yang sering bermasalah:
Solusinya biasanya bukan breakpoint tambahan, tetapi constraint yang lebih sehat.
min-width: 0 pada flex itemIni jebakan klasik.
Dalam layout flex, item sering tidak mau menyusut karena ukuran intrinsik kontennya.
.row {
display: flex;
}
.row__content {
min-width: 0;
}Tanpa ini, teks panjang bisa mendorong layout meluber.
vw tanpa batasvw berguna, tetapi kalau dipakai mentah-mentah, ukuran bisa terlalu ekstrem di layar besar atau terlalu kecil di layar sempit.
Lebih aman pakai clamp() untuk memberi batas minimum dan maksimum.
Sering kali masalah tampak seperti masalah grid atau breakpoint, padahal akar masalahnya ada di konten:
Jangan langsung menambah breakpoint kalau konten dasarnya belum dibatasi dengan benar.
Container queries kuat, tetapi tetap butuh struktur parent yang benar.
Kalau container belum disiapkan dengan benar, atau ukuran internal tidak fleksibel, hasilnya tetap bisa kacau.
.card {
display: grid;
gap: 1rem;
max-width: 100%;
padding: clamp(1rem, 2vw, 1.5rem);
}
.card__title
@media (min-width: 64rem) {
.layout {
display: grid;
grid-template-columns: 18rem minmax(0, 1fr);
gap: 1.5rem;
}
}.panel {
container-type: inline-size;
}
.panel__content {
display: grid;
grid-template-columns: 1fr;
}
@container (min-width: 36rem) {
.panel__content {
grid-template-columns: 12rem minmax(
clamp() untuk ukuran yang perlu tumbuh dan menyusut dengan batas aman.minmax(0, 1fr) dan min-width: 0 untuk mencegah overflow yang sering muncul di grid atau flex.clamp(): fungsi untuk memberi nilai minimum, ideal, dan maksimum.minmax(): fungsi grid untuk batas minimum dan maksimum track.