Masonry — это библиотека JavaScript, позволяющая создавать динамическую, сеточную раскладку элементов, адаптирующуюся к размеру контейнера и контента. Одной из важных задач при работе с Masonry является анимация появления элементов, которая делает интерфейс более плавным и привлекательным.
Masonry не предоставляет встроенных сложных анимаций появления,
однако её можно реализовать с помощью CSS-переходов, JavaScript и
дополнительных событий Masonry, таких как layoutComplete и
added.
Для начала необходимо корректно инициализировать сетку Masonry:
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true,
transitionDuration: '0.4s'
});
Ключевые моменты:
itemSelector — определяет элементы, которые будут
размещены в сетке.columnWidth — базовая ширина колонки; можно
использовать элемент с классом .grid-sizer для гибкой
раскладки.percentPosition: true — позволяет использовать
процентные значения для колонок, что важно при адаптивной верстке.transitionDuration — задаёт длительность анимации для
перемещения элементов.Чтобы элементы появлялись с анимацией, применяют CSS-переходы прозрачности и трансформации:
.grid-item {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.4s ease, transform 0.4s ease;
}
.grid-item.is-visible {
opacity: 1;
transform: translateY(0);
}
Объяснение:
opacity: 0 и transform: translateY(20px)
скрывают элемент и смещают его вниз перед анимацией.is-visible активирует переход к полной видимости
и исходному положению.transition задают скорость и плавность
анимации.Masonry предоставляет события, которые помогают запускать анимацию появления:
layoutComplete — вызывается после завершения
раскладки.added — срабатывает, когда новые элементы добавлены в
сетку.Пример добавления элементов с анимацией:
const newItems = document.querySelectorAll('.grid-item:not(.is-visible)');
newItems.forEach(item => {
grid.appendChild(item);
// Применяем класс с задержкой для запуска CSS-перехода
setTimeout(() => {
item.classList.add('is-visible');
}, 50);
});
msnry.appended(newItems);
msnry.layout();
Пояснение:
opacity: 0).setTimeout) добавляется класс
is-visible, что запускает плавное появление.msnry.appended сообщает Masonry о появлении новых
элементов, после чего вызывается layout для корректного
размещения.Для эффекта “каскада” можно использовать циклическую задержку для каждого элемента:
newItems.forEach((item, index) => {
setTimeout(() => {
item.classList.add('is-visible');
}, index * 100); // 100 мс интервал между элементами
});
Преимущества:
transition-delay в CSS для
дополнительного контроля.Если требуется анимация при прокрутке страницы, удобно использовать
IntersectionObserver:
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('is-visible');
observer.unobserve(entry.target);
}
});
}, { threshold: 0.1 });
document.querySelectorAll('.grid-item').forEach(item => {
observer.observe(item);
});
Объяснение:
unobserve), чтобы избежать повторных анимаций.0.6–0.8s).msnry.appended и применять
классы для запуска анимации.IntersectionObserver.transitionDuration и
transition-delay для оптимального визуального эффекта.Такой подход позволяет создавать сетки Masonry, где элементы не просто располагаются, а появляются с плавными и динамичными переходами, улучшая пользовательский опыт интерфейса.