Masonry — это библиотека для создания динамических сеток с плавающей компоновкой, где элементы располагаются максимально плотно, учитывая их высоту и ширину. Часто возникает необходимость удалить один элемент из сетки, сохранив корректное расположение остальных элементов. Это требует использования методов библиотеки, а также правильной работы с DOM.
removeMasonry предоставляет встроенный метод remove, который
позволяет удалить один или несколько элементов из сетки.
// Получение экземпляра Masonry
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10
});
// Выбор элемента для удаления
var itemToRemove = grid.querySelector('.grid-item:nth-child(2)');
// Удаление элемента из Masonry
msnry.remove(itemToRemove);
// Обновление макета после удаления
msnry.layout();
Пояснения:
remove(element) — метод принимает один DOM-элемент или
массив элементов.layout(),
чтобы Masonry перерасчитал позиции оставшихся элементов.transitionend для синхронизации с
layout().Для плавного исчезновения элемента перед его удалением из сетки можно использовать CSS-переходы:
.grid-item {
transition: opacity 0.4s ease, transform 0.4s ease;
}
.grid-item.removing {
opacity: 0;
transform: scale(0.8);
}
var itemToRemove = grid.querySelector('.grid-item:nth-child(2)');
itemToRemove.classList.add('removing');
// Удаление после завершения анимации
itemToRemove.addEventListener('transitionend', function() {
msnry.remove(itemToRemove);
msnry.layout();
});
Преимущества такого подхода:
Часто требуется удалять элементы по клику или другому событию:
grid.addEventListener('click', function(event) {
if(event.target.matches('.remove-btn')) {
var item = event.target.closest('.grid-item');
item.classList.add('removing');
item.addEventListener('transitionend', function() {
msnry.remove(item);
msnry.layout();
});
}
});
Ключевые моменты:
closest позволяет найти родительский элемент
.grid-item, даже если клик пришёлся на вложенный
элемент.Masonry позволяет удалять несколько элементов одним вызовом метода
remove:
var itemsToRemove = grid.querySelectorAll('.grid-item.remove-me');
msnry.remove(itemsToRemove);
msnry.layout();
Особенности:
querySelectorAll возвращает NodeList, который Masonry
автоматически преобразует в массив.layout() необходимо один раз после удаления
всех элементов, чтобы избежать лишних пересчётов.Не вызван layout() после
remove В этом случае сетка не перестроится, и
пустое место останется.
Попытка удалить элемент, который не является частью
Masonry Masonry будет игнорировать его, и layout()
не даст ожидаемого результата.
Удаление элемента без учёта анимации Если элемент исчезает мгновенно с CSS-переходами, возможны визуальные “скачки” других элементов.
При частом удалении элементов полезно использовать метод
reloadItems() для обновления внутреннего массива элементов
Masonry перед вызовом layout():
msnry.remove(item);
msnry.reloadItems();
msnry.layout();
reloadItems() пересчитывает все текущие
.grid-item внутри контейнера.Удаление элемента из Masonry оптимально сочетать с плавной анимацией
и корректным вызовом layout(). Для динамических интерфейсов
рекомендуется:
transitionend для точного момента
удаления.remove и
layout.reloadItems() для
синхронизации сетки.Эти подходы обеспечивают корректное и визуально приятное управление элементами в Masonry-сетке.