Masonry — это JavaScript-библиотека, предназначенная для построения динамических сеток с неравномерными элементами, где высота блоков может различаться. Главная особенность Masonry заключается в автоматическом уплотнении элементов по колонкам, что позволяет минимизировать пустое пространство между ними, создавая эффект “кирпичной кладки”.
В основе работы лежит расчёт позиции каждого элемента на основании высоты предыдущих элементов в колонках. При добавлении нового блока Masonry определяет колонку с наименьшей текущей высотой и помещает в неё элемент. Такой подход делает сетку адаптивной и позволяет динамически изменять её при изменении контента.
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10,
fitWidth: true
});
Для создания динамичных интерфейсов Masonry можно интегрировать с анимационными таймлайнами, например, через библиотеку GSAP. Таймлайн позволяет задавать последовательность анимаций для каждого элемента сетки.
gsap.timeline()
.from('.grid-item', {
opacity: 0,
y: 50,
stagger: 0.1,
duration: 0.6
});
Интеграция с Masonry требует обновления позиции сетки после завершения анимации, чтобы избежать наложения блоков:
imagesLoaded(grid, function() {
msnry.layout();
});
imagesLoaded используется для того, чтобы убедиться, что
все изображения в сетке загружены, так как Masonry рассчитывает позиции
на основе реальной высоты элементов.
Masonry предоставляет методы append,
prepend, remove, которые позволяют
динамически управлять содержимым сетки. При этом важно вызывать
layout() после изменений для перерасчёта расположения:
// Добавление нового элемента
var newItem = document.createElement('div');
newItem.classList.add('grid-item');
grid.appendChild(newItem);
msnry.appended(newItem);
msnry.layout();
// Удаление элемента
var itemToRemove = grid.querySelector('.grid-item');
msnry.remove(itemToRemove);
msnry.layout();
Для динамических историй или таймлайнов, где элементы появляются
последовательно, можно комбинировать append с
анимацией появления через GSAP:
gsap.from(newItem, { opacity: 0, y: 30, duration: 0.5, onComplete: () => msnry.layout() });
Masonry поддерживает адаптивное размещение элементов
при изменении ширины контейнера. Для корректного пересчёта рекомендуется
использовать событие resize и вызывать
layout():
window.addEventListener('resize', () => {
msnry.layout();
});
Это особенно важно при реализации таймлайнов и историй, когда элементы могут быть добавлены в разной последовательности и иметь разные размеры.
Для корректной работы сетки часто используют элемент sizier или задают ширину колонки через CSS:
.grid {
display: flex;
flex-wrap: wrap;
}
.grid-item {
width: 200px;
margin-bottom: 10px;
}
Можно использовать медиазапросы для изменения количества колонок и ширины блоков, сохраняя динамическую плотность сетки:
@media (max-width: 768px) {
.grid-item {
width: 45%;
}
}
Masonry автоматически перестроит сетку под новые размеры элементов
при вызове layout().
Для визуализации последовательности событий или историй можно использовать Masonry совместно с анимированными таймлайнами, где каждый блок представляет событие.
stagger в GSAP.append.Пример создания таймлайна с событиями:
var events = document.querySelectorAll('.event-item');
var tl = gsap.timeline({ defaults: { opacity: 0, y: 50, duration: 0.5 } });
events.forEach(event => {
tl.to(event, { opacity: 1, y: 0, onComplete: () => msnry.layout() });
});
Такой подход позволяет создавать интерактивные истории, где элементы появляются постепенно, сохраняя плотность и красоту сетки.
Masonry лучше всего работает с контентом переменной
высоты, особенно изображениями и карточками с текстом. Для
предотвращения проблем с неправильным расположением блоков необходимо
использовать imagesLoaded:
imagesLoaded(grid).on('progress', () => {
msnry.layout();
});
Это гарантирует, что каждый элемент займёт правильное место в колонках после загрузки всех ресурсов.
Использование этих методов позволяет строить динамичные, интерактивные таймлайны и истории с любым количеством элементов и различной высотой.
Такой подход сочетает визуальную плотность, адаптивность и динамичность, делая Masonry идеальной библиотекой для современных интерфейсов с переменным контентом.