Библиотека Masonry для JavaScript обеспечивает динамическое расположение элементов сетки, создавая «кирпичную» структуру, где высота элементов может быть разной, а ширина фиксирована или адаптивна. В ряде случаев возникает необходимость принудительно обновить сетку, чтобы Masonry корректно перераспределил элементы после изменений в DOM.
Добавление или удаление элементов после
инициализации Masonry автоматически располагает элементы при
первоначальной инициализации. Если в сетку добавляются новые элементы
через appendChild, insertAdjacentHTML или
через библиотеку для динамического контента, Masonry не будет
автоматически учитывать их без вызова специальных методов.
Изменение размеров элементов Если содержимое блока изменяет его высоту (например, текст подгружен асинхронно или загружены изображения с неизвестными размерами), Masonry требуется перерасчет положения элементов.
Динамическое изменение фильтров или видимости
элементов Когда элементы скрываются через CSS
(display: none) или фильтруются по категориям, Masonry
необходимо уведомить о том, что сетка изменилась.
masonryInstance.layout()Метод layout() выполняет перерасчет позиции всех
элементов внутри контейнера Masonry. Он не требует передачи параметров и
учитывает текущие размеры всех видимых элементов.
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10
});
// Принудительное перераспределение элементов
msnry.layout();
Особенности метода layout():
masonryInstance.reloadItems()Метод reloadItems() используется, если DOM-элементы были
добавлены или удалены, и требуется их повторная
регистрация в Masonry. После вызова reloadItems() обычно
используют layout().
msnry.reloadItems();
msnry.layout();
Пошаговое объяснение:
reloadItems() сканирует контейнер и обновляет список
элементов Masonry, основываясь на itemSelector.layout() перераспределяет элементы по сетке с учётом их
актуальных размеров.Если нужно добавить новые элементы и сразу отобразить их в Masonry:
const newItem = document.createElement('div');
newItem.classList.add('grid-item');
newItem.textContent = 'Новый элемент';
grid.appendChild(newItem);
// Обновление Masonry после добавления
msnry.appended(newItem);
Метод appended() автоматически регистраует новые
элементы и выполняет перерасчет их позиции, что удобнее, чем
последовательный вызов reloadItems() +
layout().
Для элементов с динамическим контентом (например, изображения, загружаемые через интернет), важно учитывать, что Masonry может корректно рассчитать позиции только после того, как размеры элементов известны.
imagesLoadedimagesLoaded(grid, function() {
msnry.layout();
});
layout(), чтобы
Masonry перераспределил элементы с правильной высотой.layout(): частые
перерасчеты могут привести к лагам при работе с большим количеством
элементов.appended() или
remove(): эти методы автоматически обновляют
Masonry и избегают необходимости полного
reloadItems().const newItems = document.createDocumentFragment();
for (let i = 0; i < 5; i++) {
const item = document.createElement('div');
item.className = 'grid-item';
item.textContent = `Элемент ${i + 1}`;
newItems.appendChild(item);
}
grid.appendChild(newItems);
// Регистрация новых элементов в Masonry
msnry.appended(Array.from(newItems));
// Принудительный перерасчет после динамического контента
imagesLoaded(grid, function() {
msnry.layout();
});
layout() — перерасчет существующих
элементов.reloadItems() — повторная регистрация
всех элементов перед перерасчетом.appended() / prepended()
— добавление элементов с автоматическим перераспределением.imagesLoaded гарантирует
корректную позицию для элементов с медленно загружаемыми
изображениями.Принудительное обновление Masonry обеспечивает гибкость работы с динамическим контентом, сохраняя визуальное оформление сетки без сбоев и с плавным расположением элементов.