Studi Kasus: Galeri Foto
Galeri responsif tanpa media query memakai auto-fit, minmax, dan item unggulan.
Target
Galeri foto yang: (1) otomatis menyesuaikan jumlah kolom dengan lebar layar, (2) punya satu foto unggulan lebih besar, (3) tidak ada media query sama sekali, (4) gambar tidak gepeng.
Kerangka grid responsif
.galeri {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
grid-auto-rows: 180px;
grid-auto-flow: dense;
gap: 12px;
}Satu deklarasi menangani semua ukuran layar: di HP sempit hanya 1-2 kolom yang muat, di desktop bisa 5-6. dense menambal lubang dari foto unggulan.
Foto unggulan
.foto-unggulan {
grid-column: span 2;
grid-row: span 2;
}Foto pertama menjadi 2x2. Item lain mengalir mengisi sisanya berkat dense.
Gambar tidak gepeng: object-fit
Masalah klasik galeri: foto beda rasio aspek dipaksa ke petak sama sehingga gepeng atau melar. Solusinya:
.galeri img {
width: 100%;
height: 100%;
object-fit: cover; /* potong, jangan gepengkan */
border-radius: 12px;
display: block;
}object-fit: cover memotong foto agar pas mengisi petak tanpa mengubah rasio aspek. (Detail object-fit ada di modul tersendiri.)
Contoh lengkap
<div class="galeri">
<figure class="foto-unggulan">
<img src="foto1.jpg" alt="Pemandangan utama">
</figure>
<figure><img src="foto2.jpg" alt="..."></figure>
<figure><img src="foto3.jpg" alt="..."></figure>
<!-- dst -->
</div>.galeri {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
grid-auto-rows: 180px;
grid-auto-flow: dense;
gap: 12px;
}
.galeri figure {
margin: 0;
overflow: hidden;
border-radius: 12px;
}
.galeri img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
transition: transform 0.3s;
}
.galeri img:hover {
transform: scale(1.05);
}
.foto-unggulan {
grid-column: span 2;
grid-row: span 2;
}Bonus: efek zoom halus saat hover dengan transisi + transform.
Catatan teknis:
figurepunya margin bawaan browser yang harus di-nol-kan. Dan ingatdensemengubah urutan visual: untuk galeri foto tidak masalah, tapi jangan pakai untuk konten berurutan penting.
Tips profesional
- Tambahkan
loading="lazy"pada<img>galeri agar gambar di bawah lipatan tidak diunduh duluan. - Rasio aspek seragam via
aspect-ratio: 4 / 3pada figure +object-fit: coverpada img = galeri rapi tanpa height kaku. - Efek hover zoom: bungkus img dalam figure
overflow: hidden, laluimg:hover { transform: scale(1.05); }.
Pola siap salin: galeri portofolio
.portofolio {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
grid-auto-rows: 220px;
grid-auto-flow: dense;
gap: 16px;
}
.portofolio .unggulan {
grid-column: span 2;
grid-row: span 2;
}
.portofolio img {
width: 100%; height: 100%;
object-fit: cover; border-radius: 12px;
}Satu pola untuk galeri portofolio, toko, dan blog foto. Tinggal ganti minmax sesuai kebutuhan.
Rangkuman
Galeri modern = auto-fit + minmax (responsif otomatis) + dense (tampal lubang) + object-fit cover (gambar tidak gepeng) + span untuk unggulan. Tanpa satu pun media query.
export default function App(): JSX.Element { return <h1>Hello world</h1> }
Tantangan
Galeri Tanpa Media Query
Ini pola galeri yang dipakai situs portofolio dan toko online modern. Kuasai sekali, pakai selamanya.
Di playground:
- Sempitkan preview dan hitung: berapa kolom di lebar 400px vs 900px? Tulis di komentar.
- Hapus
grid-auto-flow: dense, amati lubang yang muncul di sekitar foto unggulan. Kembalikan. - Tambahkan foto unggulan kedua (class unggulan pada foto lain) dan amati dense menata ulangnya.
<!doctype html> <html> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="styles.css" /> </head> <body> <h1>Halo CSS</h1> <p>Edit styles.css dan lihat hasilnya.</p> </body> </html>