Masonry — это библиотека JavaScript, предназначенная для создания динамических сеток с элементами различной высоты, которые располагаются компактно, без фиксированных рядов. Основной принцип Masonry заключается в автоматическом размещении элементов в наименьший доступный вертикальный промежуток, что позволяет создавать визуально сбалансированные и адаптивные интерфейсы, особенно для галерей изображений, карточек контента и ленточных макетов.
Для использования Masonry необходимо подключить библиотеку через npm или CDN.
Через npm:
npm install masonry-layout
Через CDN:
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
После подключения создается экземпляр Masonry с передачей контейнера и настроек:
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true,
gutter: 10
});
Для обеспечения корректного отображения сетки на разных разрешениях экрана Masonry поддерживает процентные размеры и динамическое пересчёт положения элементов при изменении ширины контейнера. Использование imagesLoaded помогает корректно рассчитывать высоту элементов с изображениями:
imagesLoaded(grid, function() {
msnry.layout();
});
Это гарантирует, что элементы будут размещены после полной загрузки всех изображений, предотвращая смещение сетки.
Masonry позволяет динамически добавлять новые элементы и удалять существующие без полной перерисовки сетки.
Добавление элементов:
var newItem = document.createElement('div');
newItem.className = 'grid-item';
newItem.innerHTML = '<img src="image.jpg">';
grid.appendChild(newItem);
msnry.appended(newItem);
msnry.layout();
Удаление элементов:
msnry.remove(newItem);
msnry.layout();
Это особенно важно при работе с контентом, подгружаемым через API или реализующим бесконечную прокрутку.
Для больших сеток важно минимизировать лишние пересчеты:
window.addEventListener('resize', debounce(function() {
msnry.layout();
}, 200));
DocumentFragment и последующая вставка в контейнер
минимизирует количество reflow:var fragment = document.createDocumentFragment();
items.forEach(item => fragment.appendChild(item));
grid.appendChild(fragment);
msnry.appended(items);
msnry.layout();
width и height для
изображений позволяет Masonry сразу рассчитать правильную высоту ячеек
без ожидания полной загрузки контента.Masonry хорошо интегрируется с библиотеками для lazy-loading, фильтрации и анимации:
lazysizes
или IntersectionObserver:document.addEventListener('lazyloaded', function(e) {
msnry.layout();
});
hidden с последующим пересчетом:items.forEach(item => item.classList.toggle('hidden', !condition(item)));
msnry.layout();
GSAP совместимы с Masonry, если вы вызываете
msnry.layout() после изменения размеров или позиции
элементов.Для мониторинга работы Masonry в продакшене важно учитывать:
imagesLoaded и события error для
изображений.layout() для выявления узких мест.Эффективная интеграция Masonry в продакшен требует балансировки между динамичностью контента и производительностью, особенно на мобильных устройствах и при большом количестве элементов.
var msnry = new Masonry(grid, { fitWidth: true });
msnry.stamp(document.querySelector('.fixed-item'));
msnry.layout();
resize можно использовать ResizeObserver для
более точного контроля за изменением размеров контейнера и
элементов.Masonry сочетает гибкость и высокую адаптивность, позволяя создавать сложные сетки с минимальным количеством кода и высокой производительностью, при правильной настройке и отслеживании состояния в продакшене.