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.






auto-fit kết hợp minmax giúp code CSS trở nên siêu tinh gọn, dễ đọc và dễ bảo trì.aspect-ratio: 1 / 1 và object-fit: cover đảm bảo các item luôn là hình vuông đều đặn, cho dù hình ảnh gốc có các kích thước khác nhau.transform: translateY và scale) cùng đổ bóng (box-shadow) khi hover sẽ báo hiệu trực quan cho người dùng rằng đây là các phần tử có thể tương tác được.cubic-bezier mang lại cảm giác chuyển động mượt mà và tự nhiên hơn.200px trong minmax(200px, 1fr), bạn có thể kiểm soát kích thước nhỏ nhất của mỗi item. Giá trị này càng lớn, số lượng cột tối đa trên một hàng sẽ càng ít đi.16 / 9 (khung hình ngang) hoặc 3 / 4 (khung hình dọc).<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> .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;
} display: grid và aspect-ratio đều được hỗ trợ đầy đủ trên tất cả các trình duyệt hiện đại (Chrome, Firefox, Safari, Edge).