Для использования Masonry в проекте необходимо подключить библиотеку через npm или CDN. Если используется npm:
npm install masonry-layout
После установки подключение выглядит так:
import Masonry from 'masonry-layout';
HTML-структура для Masonry предполагает наличие контейнера и дочерних элементов — «ячееек», которые будут выстраиваться в сетку:
<div class="grid">
<div class="grid-item">Виджет 1</div>
<div class="grid-item">Виджет 2</div>
<div class="grid-item">Виджет 3</div>
</div>
Каждый .grid-item может иметь различную высоту, что
Masonry корректно обрабатывает, создавая «кирпичную» сетку.
Для запуска Masonry необходимо передать контейнер и параметры:
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 20,
fitWidth: true
});
Пояснения параметров:
itemSelector — селектор элементов сетки.columnWidth — ширина колонок. Может быть числом
(фиксированная ширина) или элементом (.grid-sizer).gutter — расстояние между колонками.fitWidth — если true, сетка центрируется
внутри контейнера.Для динамической подгрузки виджетов можно использовать метод
appended:
const newItems = document.createElement('div');
newItems.className = 'grid-item';
newItems.textContent = 'Новый виджет';
grid.appendChild(newItems);
msnry.appended(newItems);
Masonry отлично работает с виджетами произвольной высоты. Для более
точного контроля часто используют «сайзер»
(.grid-sizer):
<div class="grid">
<div class="grid-sizer"></div>
<div class="grid-item">Виджет A</div>
<div class="grid-item">Виджет B</div>
</div>
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
gutter: 20,
percentPosition: true
});
Использование .grid-sizer позволяет легко адаптировать
сетку под разные размеры экранов и поддерживать процентные значения
колонок.
Для корректной работы Masonry при изменении размеров окна необходимо
вызывать layout():
window.addEventListener('resize', () => {
msnry.layout();
});
Если виджеты динамически изменяют высоту (например, через загрузку
данных), также рекомендуется вызывать layout() после
изменений:
someWidget.addEventListener('contentLoaded', () => {
msnry.layout();
});
Masonry поддерживает CSS-переходы. Для плавного смещения виджетов добавляются классы с анимацией:
.grid-item {
transition: transform 0.4s ease;
}
При добавлении новых виджетов или изменении размеров сетка плавно перестраивается.
Для dashboard важно поддерживать добавление и удаление виджетов:
// Добавление
const widget = document.createElement('div');
widget.className = 'grid-item';
widget.textContent = 'Новый виджет';
grid.appendChild(widget);
msnry.appended(widget);
// Удаление
grid.removeChild(widget);
msnry.remove(widget);
msnry.layout();
Метод remove удаляет элемент из Masonry, после чего
layout() перерассчитывает расположение оставшихся
виджетов.
Masonry часто комбинируется с изображениями
(imagesLoaded) для корректного выравнивания:
import imagesLoaded from 'imagesloaded';
imagesLoaded(grid, () => {
msnry.layout();
});
Это предотвращает проблемы, когда изображения в виджетах загружаются с задержкой и нарушают сетку.
Для dashboard с виджетами разного размера можно использовать
медиазапросы и динамическое изменение columnWidth:
function updateMasonryColumns() {
const width = window.innerWidth;
if (width < 600) {
msnry.options.columnWidth = 150;
} else {
msnry.options.columnWidth = 200;
}
msnry.layout();
}
window.addEventListener('resize', updateMasonryColumns);
updateMasonryColumns();
Это позволяет сетке быть адаптивной и сохранять гармоничное размещение виджетов на разных устройствах.
Masonry по умолчанию располагает элементы в порядке появления в DOM.
Для сортировки или фильтрации можно использовать комбинацию с
библиотекой Array.sort или filter и затем
вызывать reloadItems() и layout():
const items = Array.from(grid.children);
items.sort((a, b) => a.dataset.order - b.dataset.order);
items.forEach(item => grid.appendChild(item));
msnry.reloadItems();
msnry.layout();
Это позволяет динамически изменять порядок виджетов без пересоздания сетки с нуля.
Для больших дашбордов важно минимизировать перерасчеты.
imagesLoaded для сеток с
изображениями.appended.requestAnimationFrame при массовых
изменениях.Masonry обеспечивает гибкую, динамичную и адаптивную сетку для виджетов, позволяя создавать dashboard с произвольными размерами элементов, плавной анимацией и поддержкой динамического контента.