Адаптивная галерея с «резиной»
Давайте разберём, как построить галерею, с «резиной», адаптивностью и фиксированными пропорциями изображений.
Изображения будут плавно менять размер между брейкпоинтами, сохранять пропорции, а при достижении брейкпоинтов сетка галереи будет перестраиваться.
Зададим размеры картинок с помощью CSS. Установим для них ширину 200 пикселей.
Высоту зададим так, чтобы не нарушились пропорции. Используем стандартный приём нормализации картинок — height: auto; object-fit: contain;.
Добавим в разметку <div> с классом gallery__box.
С помощью этого контейнера построим сетку галереи на гридах. Благодаря гридам мы сможем быстро поменять раскладку и установить нужное количество столбцов.
Зададим разное количество столбцов в галерее в зависимости от ширины вьюпорта. Медиазапросы построим с помощью min-width. Чтобы добиться резинового поведения, используем fr для ширины столбцов.
Попробуйте изменить размеры окна мини-браузера и проверьте, что карточки перестраиваются.
Изображения в галерее должны быть квадратными вне зависимости от исходной формы изображений. Поэтому зададим для изображений CSS-свойство aspect-ratio со значением 1 / 1.
И изменим значение свойства object-fit c contain на cover. Отлично. Геометрия всех картинок стала одинаковой.
Следующая задача — сделать картинки резиновыми.
Поменяем значение ширины картинок 200px на 100%. Теперь картинки будут «тянуться» и изменять ширину вслед за контейнером, при этом сохранять квадратную форму.
Можете изменить ширину мини-браузера и посмотреть на полученный эффект.
Добавим gap размером 10px грид-контейнеру, чтобы изображения не слипались.
Адаптивно-резиновая галерея готова. Картинки тянутся при изменении ширины экрана, а на определённых брейкпоинтах сетка галереи перестраивается.
Напоследок поэкспериментируем с container queries.
Зададим контейнеру gallery фиксированную ширину, автоматические внешние отступы по горизонтали, добавим обводку.
С помощью свойства container объявим containment context для блока gallery. Подберём для контекста оригинальное имя — gallery.
Заменим обычные медиазапросы на запросы к контейнеру gallery. Стили внутри запросов к контейнеру теперь будут реагировать на ширину блока .gallery.
Добавим анимацию, которая плавно меняет ширину блока .gallery от 900px до 400px и обратно.
Анимация позволяет увидеть поведение адаптивно-резиновой галереи. Также можно заметить, что запросы к контейнеру работают. Если хотите лучше рассмотреть анимацию, измените масштаб в мини-браузере.