Masonry — это библиотека для динамического позиционирования элементов сетки, которая позволяет создавать плотные, «кирпичные» макеты с переменной высотой карточек. В контексте E-commerce каталога она особенно полезна для отображения товаров с различными размерами изображений и описаний, обеспечивая аккуратное распределение контента без пустых промежутков.
Ключевой принцип Masonry заключается в том, что элементы располагаются по колонкам так, чтобы минимизировать вертикальные пробелы. Каждая новая карточка товара помещается в колонку с наименьшей высотой, что обеспечивает «естественное» расположение товаров независимо от их индивидуальной высоты.
Masonry может быть подключен несколькими способами: через npm или CDN.
Через npm:
npm install masonry-layout
Через CDN:
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
После подключения необходимо инициализировать сетку:
const grid = document.querySelector('.grid');
const masonry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true,
gutter: 20
});
itemSelector — селектор элементов, которые будут
расположены в сетке.columnWidth — базовая ширина колонки; может быть задана
через отдельный элемент .grid-sizer.percentPosition — использование процентных значений
ширины колонок.gutter — расстояние между элементами.Правильная структура HTML важна для корректной работы Masonry:
<div class="grid">
<div class="grid-sizer"></div>
<div class="grid-item">
<img src="product1.jpg" alt="Товар 1">
<h3>Название товара 1</h3>
<p>Описание товара</p>
<span class="price">$49.99</span>
</div>
<div class="grid-item">
<img src="product2.jpg" alt="Товар 2">
<h3>Название товара 2</h3>
<p>Описание товара</p>
<span class="price">$39.99</span>
</div>
</div>
.grid-sizer используется для расчета ширины колонок.
.grid-item — карточка товара, которая может иметь
переменную высоту.
Для E-commerce важно, чтобы Masonry корректно рассчитывал высоту элементов после загрузки изображений. Для этого применяется библиотека imagesLoaded:
npm install imagesloaded
imagesLoaded(grid, function() {
masonry.layout();
});
Это гарантирует, что сетка будет правильно выстроена только после полной загрузки всех изображений, предотвращая смещение карточек.
Для больших каталогов часто используется ленивое подгружение (infinite scroll). Masonry позволяет добавлять новые элементы в уже существующую сетку:
const newItems = document.querySelectorAll('.new-grid-item');
grid.append(...newItems);
masonry.appended(newItems);
append добавляет элементы в DOM.masonry.appended() сообщает Masonry о новых элементах,
чтобы пересчитать позиции.Для корректного отображения на разных устройствах необходимо использовать медиазапросы для колонок и ширины элементов:
.grid-item {
width: 100%;
}
@media (min-width: 768px) {
.grid-sizer, .grid-item {
width: 48%;
}
}
@media (min-width: 1200px) {
.grid-sizer, .grid-item {
width: 30%;
}
}
Такой подход обеспечивает гибкость сетки, позволяя карточкам занимать разное количество колонок в зависимости от ширины экрана.
Для больших каталогов важно оптимизировать Masonry:
percentPosition: true для снижения
перерасчетов размеров при ресайзе.transitionDuration для плавного
перемещения элементов без лишних перерисовок.const masonry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true,
gutter: 20,
transitionDuration: '0.3s'
});
Для каталогов важно интегрировать Masonry с фильтрацией и сортировкой товаров. После изменения набора элементов необходимо заново инициировать пересчет:
const filteredItems = document.querySelectorAll('.grid-item.filtered');
grid.innerHTML = '';
grid.append(...filteredItems);
masonry.reloadItems();
masonry.layout();
reloadItems() пересчитывает список элементов.layout() перестраивает сетку на основе новых
данных.Masonry поддерживает:
Пример увеличенного блока для акции:
.grid-item.promo {
grid-column: span 2;
height: 400px;
}
masonry.layout();
Такой блок автоматически займет нужное количество колонок и будет вписан в общую сетку без нарушения визуальной гармонии.
Эти подходы обеспечивают создание E-commerce каталогов, где Masonry оптимально распределяет карточки товаров, учитывая их высоту, изображения и динамическое добавление контента, обеспечивая аккуратный, современный и адаптивный макет.