Masonry — это библиотека для создания сеток с динамическим расположением элементов, которая автоматически выстраивает элементы по вертикали, минимизируя пустое пространство. Стандартное поведение Masonry обеспечивает базовую анимацию перестройки элементов при добавлении, удалении или изменении размеров. Однако для создания уникального визуального опыта часто требуется кастомная анимация появления элементов.
Для этого используется сочетание CSS-анимаций,
JavaScript-событий и методов Masonry, таких как
layout, appended и prepended.
Важно понимать, что Masonry управляет позицией элементов через
inline-стили transform и top/left, поэтому
кастомные анимации должны корректно взаимодействовать с этими
изменениями.
Для начала необходимо задать элементам исходное состояние, с которого будет выполняться анимация. Чаще всего используется комбинация прозрачности и смещения:
.grid-item {
opacity: 0;
transform: translateY(30px);
transition: transform 0.5s ease, opacity 0.5s ease;
}
.grid-item.is-visible {
opacity: 1;
transform: translateY(0);
}
Ключевые моменты:
opacity: 0 и transform: translateY(30px)
создают эффект появления снизу.transition задаёт продолжительность и плавность
анимации..is-visible применяется динамически через
JavaScript после размещения элементов Masonry.После добавления элементов в контейнер Masonry важно корректно их
визуализировать. Для этого применяется метод appended:
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true
});
// Добавление новых элементов
const newItems = document.createElement('div');
newItems.classList.add('grid-item');
newItems.innerHTML = 'Новый элемент';
grid.appendChild(newItems);
// Сообщаем Masonry о новых элементах
msnry.appended(newItems);
// Запускаем кастомную анимацию после layout
requestAnimationFrame(() => {
newItems.classList.add('is-visible');
});
Примечания:
requestAnimationFrame гарантирует, что анимация
запускается после того, как браузер применил новые позиции Masonry.appended не только добавляет элементы в сетку, но
и пересчитывает их позиции.Если необходимо анимировать группу элементов, удобнее использовать перебор с задержкой для создания эффекта последовательного появления:
const items = document.querySelectorAll('.grid-item:not(.is-visible)');
items.forEach((item, index) => {
setTimeout(() => {
item.classList.add('is-visible');
}, index * 100); // задержка 100ms между элементами
});
Эффект:
При изменении размеров контейнера Masonry пересчитывает позиции
элементов. Для сохранения корректной анимации стоит использовать событие
layoutComplete:
msnry.on('layoutComplete', function(items) {
items.forEach(item => {
if (!item.element.classList.contains('is-visible')) {
item.element.classList.add('is-visible');
}
});
});
Пояснение:
layoutComplete срабатывает после каждого пересчёта
Masonry.Для более сложных эффектов появления применяются CSS keyframes. Например, эффект «всплытия с поворотом»:
@keyframes popIn {
0% {
opacity: 0;
transform: scale(0.8) rotate(-10deg);
}
100% {
opacity: 1;
transform: scale(1) rotate(0deg);
}
}
.grid-item.is-visible {
animation: popIn 0.6s ease forwards;
}
Особенности:
forwards сохраняет конечное состояние после
анимации.scale и rotate создаёт эффект
объёмного появления.Важно помнить, что Masonry управляет transform для
позиционирования элементов. Чтобы кастомные анимации не конфликтовали с
позиционированием:
<div class="grid-item">
<div class="grid-item-content">Содержимое</div>
</div>
.grid-item-content {
opacity: 0;
transform: translateY(20px);
transition: all 0.5s ease;
}
.grid-item-content.is-visible {
opacity: 1;
transform: translateY(0);
}
.grid-item, а
.grid-item-content анимируется отдельно.appended,
prepended и layoutComplete для полного
контроля.Для продвинутых сценариев кастомной анимации можно добавлять:
translateX, translateY,
rotate).Пример с рандомной задержкой:
items.forEach(item => {
const delay = Math.random() * 300;
setTimeout(() => item.classList.add('is-visible'), delay);
});
Эти методы позволяют полностью контролировать процесс появления элементов в Masonry, сочетая плавное позиционирование с разнообразными визуальными эффектами. Такой подход делает сетку более живой и адаптивной, подходящей для сложных интерфейсов и интерактивных галерей.