Bằng cách kết hợp display: grid với grid-template-columns: repeat(auto-fit, minmax(..., 1fr)), bạn có thể dễ dàng tạo ra một image gallery có khả năng tự động tính toán lại số cột tùy theo chiều rộng của viewport. Kỹ thuật này giúp layout responsive một cách hoàn hảo mà không cần phải viết thêm bất kỳ một dòng media query (@media) nào.

Xem trước (Preview)

Ứng dụng & Tính năng nổi bật (Use Cases & Features)

Thiết kế & Trải nghiệm người dùng (Design & UX)

Hướng dẫn tùy chỉnh (Customization)

Mã nguồn (Implementation)

index.html
<div class="gallery">
<img src="/gallery/1.png" alt="Gallery image 1" class="gallery-item" />
<img src="/gallery/2.png" alt="Gallery image 2" class="gallery-item" />
<img src="/gallery/3.png" alt="Gallery image 3" class="gallery-item" />
<img src="/gallery/4.png" alt="Gallery image 4" class="gallery-item" />
<img src="/gallery/5.png" alt="Gallery image 5" class="gallery-item" />
<img src="/gallery/6.png" alt="Gallery image 6" class="gallery-item" />
</div>
styles.css
.gallery {
display: grid;
/* Tự động điều chỉnh số lượng cột để lấp đầy container trong phạm vi không dưới 200px */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
padding: 16px;
width: 100%;
box-sizing: border-box;
}

.gallery-item {
width: 100%;
/* Luôn giữ nguyên hình vuông */
aspect-ratio: 1 / 1;
/* Cắt ảnh sao cho tỷ lệ không bị phá vỡ */
object-fit: cover;
border-radius: 8px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), 
            box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1);
cursor: pointer;
}

.gallery-item:hover {
/* Hiệu ứng nổi lên một chút khi hover */
transform: translateY(-4px) scale(1.02);
box-shadow: 0 12px 20px rgba(0, 0, 0, 0.1);
z-index: 10;
}

Hỗ trợ trình duyệt (Browser Support)