Episode ini membahas gambar responsif: atribut srcset dan sizes untuk memilih ukuran yang tepat, elemen picture untuk format dan art direction, serta object-fit dan object-position untuk memotong gambar di dalam bingkai yang sudah ditentukan.

Gambar sering menjadi penyumbang terbesar berat sebuah halaman. Memuat gambar 2000px untuk tampil di kolom 300px membuang bandwidth dan memperlambat waktu muat. Responsive images menyelesaikan masalah ini dengan memilih sumber gambar yang tepat sesuai kondisi perangkat.
Di sisi visual, ada masalah lain: bingkai yang tidak sesuai rasio aspek gambar. Di sinilah object-fit berperan — mengontrol bagaimana gambar diisi ke dalam kotak tanpa distorsi.
Mengapa penting? Halaman cepat adalah halaman yang ramah pengguna dan mendapat peringkat lebih baik. Menguasai srcset, picture, dan object-fit membuat kalian memuat gambar secukupnya dan menampilkannya dengan benar di semua rasio layar.
srcset memberi browser daftar gambar dengan lebar intrinsik masing-masing. Browser memilih mana yang paling cocok berdasarkan viewport dan faktor kepadatan piksel:
<img
src="kucing-800.jpg"
srcset="kucing-400.jpg 400w, kucing-800.jpg 800w, kucing-1600.jpg 1600w"
sizes="(min-width: 900px) 50vw, 100vw"
alt="Kucing sedang tidur"
width="800"
height="600"
>Atribut sizes memberi tahu browser ruang yang akan ditempati gambar pada kondisi tertentu. Aturan ini mengharuskan atribut width dan height agar browser menghitung ruang sebelum gambar dimuat — mencegah layout melompat saat gambar tiba.
<img
src="logo.png"
srcset="logo.png 1x, logo@2x.png 2x"
alt="Logo DevNull"
>Notasi 1x dan 2x memilih gambar sesuai device pixel ratio. Pada layar Retina (rasio 2), browser mengambil logo@2x.png sehingga gambar tetap tajam.
srcset hanya memilih versi lebih besar atau kecil dari gambar yang sama. Bila gambar perlu dipotong berbeda di layar tertentu — art direction — gunakan elemen picture:
<picture>
<source
srcset="gambar-lanskap.jpg"
media="(min-width: 900px)"
>
<source
srcset="gambar-potret.jpg"
media="(min-width: 480px)"
>
<img
src="gambar-potret.jpg"
alt="Pemandangan gunung"
loading="lazy"
>
</picture>Browser memakai source pertama yang media query-nya cocok. Elemen img di akhir berperan sebagai fallback sekaligus sumber alt dan atribut lainnya. source juga bisa memilih format modern seperti WebP atau AVIF:
<picture>
<source srcset="gambar.avif" type="image/avif">
<source srcset="gambar.webp" type="image/webp">
<img src="gambar.jpg" alt="Ilustrasi" loading="lazy">
</picture>Browser yang mendukung AVIF memuatnya; yang tidak, turun ke WebP, lalu terakhir ke JPEG. Format lebih baru umumnya jauh lebih kecil dengan kualitas visual serupa.
Elemen img yang diberi width dan height tetap akan terdistorsi bila rasio aspek tidak cocok. object-fit mengubah perilaku ini:
.gambar-cover {
width: 100%;
height: 240px;
object-fit: cover;
}
.gambar-contain {
width: 100%;
height: 240px;
object-fit: contain;
object-position: center;
}object-fit: cover memotong gambar agar memenuhi bingkai tanpa distorsi — pilihan umum untuk thumbnail dan hero. contain memasukkan seluruh gambar ke dalam bingkai, menyisakan ruang kosong bila rasio tidak cocok.
.avatar {
width: 96px;
height: 96px;
border-radius: 50%;
object-fit: cover;
object-position: top;
}object-position menggeser area gambar yang terlihat. top menampilkan bagian atas gambar — penting untuk foto wajah yang biasanya terpotong jika diposisikan tengah.
Gabungan aspect-ratio dan object-fit menghasilkan bingkai gambar yang stabil:
.thumbnail {
aspect-ratio: 16 / 9;
width: 100%;
object-fit: cover;
display: block;
}Properti aspect-ratio menetapkan rasio bingkai terlepas dari ukuran intrinsic gambar. Menggabungkannya dengan object-fit: cover dan atribut width/height pada HTML membuat placeholder, kartu, dan galeri tampil konsisten dan tanpa pergeseran layout.
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Kartu Gambar</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<article class="kartu">
<img
class="gambar"
src="https://picsum.photos/seed/devnull/800/450"
srcset="https://picsum.photos/seed/devnull/400/225 400w,
https://picsum.photos/seed/devnull/800/450 800w"
sizes="(min-width: 640px) 50vw, 100vw"
alt="Gambar artikel"
width="800"
height="450"
loading="lazy"
>
<div class="isi">
<h2>Judul Artikel</h2>
<p>Deskripsi singkat artikel yang ditampilkan di kartu.</p>
</div>
</article>
</body>
</html>* { box-sizing: border-box; }
body { margin: 0; padding: 24px; font-family: system-ui, sans-serif; background-color: #f1f5f9; }
.kartu { max-width: 640px; margin-inline: auto; background-color: white; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 12px rgba(15, 23, 42, 0.1); }
.gambar { display: block; width: 100%; aspect-ratio: 16 / 9; object-fit: cover; }
.isi { padding: 24px; }Jalankan npx serve ., lalu buka tab Network di DevTools. Saat viewport menyempit, browser seharusnya memuat versi 400w yang lebih kecil. Pilihan sumber ini terjadi di browser, sehingga kalian tidak perlu menulis logika manual.
Bila gambar tampak melebar atau memanjang, cek apakah height dipasang bersama width tanpa object-fit. Tambahkan object-fit: cover dan tentukan rasio yang diinginkan.
Tanpa sizes, browser menganggap gambar selebar viewport penuh dan cenderung memilih versi terbesar. Selalu sertakan sizes yang akurat agar pilihan gambar efisien.
img tanpa width dan height tidak menyediakan ruang sebelum muat, menyebabkan layout shift. Sertakan dimensi intrinsik pada setiap gambar.
Inti yang harus dibawa pulang:
srcset dengan lebar dan sizes memilih gambar sesuai viewport.1x dan 2x menyesuaikan kepadatan piksel layar.picture memungkinkan art direction dan pemilihan format modern.object-fit: cover memotong gambar tanpa distorsi; contain menampilkan utuh.object-position menggeser area gambar yang terlihat.aspect-ratio dan atribut dimensi mencegah pergeseran layout.
Di episode 12 selanjutnya kita akan membahas mobile-first design dan adaptasi device — mendesain untuk ponsel terlebih dahulu serta menangani notch, safe area, dan target sentuh.