Masonry предоставляет несколько встроенных событий, которые позволяют отслеживать состояние сетки и взаимодействовать с элементами при динамических изменениях. Основные события можно разделить на следующие категории:
imagesLoaded).Каждое событие возвращает объект Masonry и массив элементов, затронутых событием, что позволяет использовать эти данные для последующих операций.
var msnry = new Masonry('.grid', {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10
});
msnry.on('layoutComplete', function(items) {
console.log('Сетка обновлена. Элементов:', items.length);
});
При динамическом добавлении элементов в сетку важно не только
вставить их в DOM, но и корректно инициализировать Masonry для новых
элементов. Используется метод append вместе с событием
appended.
var newItem = document.createElement('div');
newItem.className = 'grid-item';
newItem.textContent = 'Новый элемент';
document.querySelector('.grid').appendChild(newItem);
msnry.appended(newItem);
msnry.on('layoutComplete', function(laidOutItems) {
console.log('Добавлены новые элементы:', laidOutItems.length);
});
Важный момент: метод appended не только добавляет
элемент в сетку Masonry, но и инициирует пересчет компоновки, что
предотвращает наложение элементов.
Удаление элементов из Masonry требует использования метода
remove, после которого желательно вызвать
layout для обновления сетки. Событие
removeComplete позволяет выполнять дополнительные действия,
например, анимацию удаления.
var itemToRemove = document.querySelector('.grid-item');
msnry.remove(itemToRemove);
msnry.layout();
msnry.on('removeComplete', function(removedItems) {
console.log('Элементы удалены:', removedItems.length);
});
Использование этого события обеспечивает корректное взаимодействие с внешними скриптами и сохранение целостности сетки.
Частая задача в сетках Masonry — работа с изображениями различного
размера. Для корректного позиционирования элементов необходимо дождаться
полной загрузки изображений. Для этого интегрируют библиотеку
imagesLoaded.
imagesLoaded('.grid', function() {
msnry.layout();
});
Также можно подписаться на событие для каждой отдельной картинки:
imagesLoaded('.grid img').on('progress', function(instance, image) {
console.log('Изображение загружено:', image.img.src);
});
Это позволяет выполнять плавную анимацию появления элементов и предотвращает смещение сетки из-за поздно загруженных картинок.
Помимо встроенных событий, Masonry позволяет комбинировать их с пользовательскими событиями через стандартные механизмы DOM. Например, можно создавать событие клика по элементу и реагировать на него обновлением сетки:
document.querySelector('.grid').addEventListener('click', function(event) {
if(event.target.classList.contains('grid-item')) {
event.target.style.backgroundColor = 'lightblue';
msnry.layout();
}
});
Такой подход позволяет создавать интерактивные сетки с динамическим изменением стиля элементов без нарушения компоновки.
При частых обновлениях сетки (например, при infinite scroll или
live-редактировании контента) важно минимизировать количество вызовов
layout. Для этого применяются следующие методы:
appended и
remove вместо полного пересчета всей сетки.var debounceLayout = _.debounce(function() {
msnry.layout();
}, 100);
window.addEventListener('resize', debounceLayout);
Применение этих техник обеспечивает плавную работу интерфейса даже при большом количестве элементов в сетке.
События Masonry можно комбинировать для создания сложных интерактивных сценариев:
Каждое событие предоставляет контекстные данные (items
или removedItems), что позволяет строить цепочки действий и
синхронизировать Masonry с другими библиотеками, например, для анимаций
или фильтрации элементов.
Такой подход превращает Masonry из простой библиотеки для расположения блоков в мощный инструмент для создания интерактивных и динамических интерфейсов.