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 — расстояние между элементами сетки.Для корректной работы 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; }
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 для предотвращения пересчёта
сетки до загрузки изображений.requestAnimationFrame при динамическом
добавлении большого числа элементов для плавного рендеринга.msnry.layout() после
изменения видимости.Эти возможности делают Masonry универсальным инструментом для создания адаптивных, динамичных галерей изображений с минимальными усилиями и максимальной гибкостью в кастомизации.