Галереи изображений

Masonry — это JavaScript-библиотека, предназначенная для создания сеток с динамическими элементами, расположенными в виде кирпичной кладки. В отличие от стандартных CSS-сеток, Masonry автоматически располагает элементы так, чтобы минимизировать вертикальные пробелы, создавая визуально плотную и гармоничную структуру.

Ключевой принцип работы библиотеки заключается в расчёте высоты колонок и распределении элементов в наименее заполненные из них. Это обеспечивает адаптивность и гибкость при работе с изображениями различного размера.


Подключение и инициализация

Для начала необходимо подключить библиотеку через CDN или локальный файл:

<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>

Инициализация выполняется с помощью Jav * aScript:

var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
  itemSelector: '.grid-item',
  columnWidth: '.grid-sizer',
  percentPosition: true,
  gutter: 10
});

Пояснения параметров:

  • itemSelector — CSS-класс элементов сетки.
  • columnWidth — ширина колонки, может быть фиксированной или относительной через элемент-сайзер.
  • percentPosition — использование процентов для вычисления позиции элементов.
  • gutter — расстояние между элементами сетки.

Структура HTML для сетки

Для корректной работы Masonry рекомендуется использовать вспомогательный элемент-сайзер:

<div class="grid">
  <div class="grid-sizer"></div>
  <div class="grid-item"><img src="image1.jpg" alt=""></div>
  <div class="grid-item"><img src="image2.jpg" alt=""></div>
  <div class="grid-item"><img src="image3.jpg" alt=""></div>
</div>
  • .grid-sizer определяет базовую ширину колонки.
  • .grid-item — отдельные элементы сетки, которые Masonry будет располагать.

Адаптивность и ресайз

Masonry поддерживает динамическое перераспределение элементов при изменении размеров окна. Для этого можно вызвать метод:

msnry.layout();

или использовать событие imagesLoaded для корректной загрузки изображений перед вычислением сетки:

imagesLoaded(grid, function() {
  msnry.layout();
});

Важно: Masonry вычисляет позиции элементов только после того, как известны их размеры, поэтому использование imagesLoaded критично для галерей с изображениями разной высоты.


Настройка колонок и отступов

Фиксированная ширина колонок:

columnWidth: 200

Использование сайта для колонок:

<div class="grid-sizer"></div>
.grid-sizer { width: 25%; }

Отступы между элементами (gutter): задаются через опцию gutter или через CSS маргин:

.grid-item { margin-bottom: 10px; }

Методы Masonry

  • msnry.layout() — пересчитывает позиции всех элементов.
  • msnry.appended(elements) — добавляет новые элементы в сетку и размещает их.
  • msnry.remove(elements) — удаляет элементы из сетки.
  • msnry.destroy() — полностью уничтожает экземпляр Masonry, возвращая элементы в исходное состояние.

Пример добавления нового изображения:

var newItem = document.createElement('div');
newItem.className = 'grid-item';
newItem.innerHTML = '<img src="image4.jpg" alt="">';
grid.appendChild(newItem);
msnry.appended(newItem);

Анимации и переходы

Для плавного появления элементов можно использовать CSS-транзишны:

.grid-item {
  transition: transform 0.4s, opacity 0.4s;
}

Masonry будет управлять позиционированием через transform, создавая эффект плавного перемещения элементов при добавлении или удалении.


Совместимость с фреймворками

Masonry легко интегрируется с React, Vue и другими современными фреймворками. Для React существует обёртка react-masonry-component, которая обеспечивает управление состоянием через props и компоненты.

Пример использования в React:

import Masonry from 'react-masonry-component';

const images = ['image1.jpg', 'image2.jpg', 'image3.jpg'];

<Masonry className={'grid'} options={{ gutter: 10 }}>
  {images.map((src, index) => (
    <div className="grid-item" key={index}>
      <img src={src} alt="" />
    </div>
  ))}
</Masonry>

Оптимизация производительности

  • Использовать imagesLoaded для предотвращения пересчёта сетки до загрузки изображений.
  • Минимизировать количество DOM-элементов в одной Masonry-сетке.
  • Устанавливать фиксированную ширину колонок, чтобы ускорить вычисления.
  • Использовать requestAnimationFrame при динамическом добавлении большого числа элементов для плавного рендеринга.

Продвинутые возможности

  1. Фильтрация элементов: можно динамически скрывать или показывать элементы, вызывая msnry.layout() после изменения видимости.
  2. Сортировка: элементы можно перемещать в DOM и затем обновлять Masonry, чтобы сетка перестроилась.
  3. Интеграция с lazy loading: Masonry хорошо работает с библиотеками ленивой загрузки изображений, что позволяет экономить ресурсы и ускорять начальную загрузку.

Эти возможности делают Masonry универсальным инструментом для создания адаптивных, динамичных галерей изображений с минимальными усилиями и максимальной гибкостью в кастомизации.