Masonry — это библиотека для создания динамических сеток с поддержкой плотного позиционирования элементов. Часто возникает необходимость удалять сразу несколько элементов из сетки, корректно обновляя её расположение и анимацию. Рассмотрим этот процесс детально.
Masonry предоставляет два ключевых метода для удаления элементов:
remove — удаляет элементы из DOM и
обновляет сетку.reloadItems + layout —
используется для пересчета позиций после удаления элементов
вручную.remove// Инициализация Masonry
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10
});
// Получение элементов для удаления
var itemsToRemove = grid.querySelectorAll('.remove-me');
// Удаление элементов из Masonry
msnry.remove(itemsToRemove);
// Обновление расположения сетки
msnry.layout();
Ключевые моменты:
remove принимает NodeList,
массив элементов или одиночный элемент.layout() для
корректного перерасчета сетки.Для плавного исчезновения элементов перед удалением можно использовать CSS-переходы:
.grid-item {
transition: opacity 0.3s ease;
}
.grid-item.removing {
opacity: 0;
}
var itemsToRemove = grid.querySelectorAll('.remove-me');
itemsToRemove.forEach(function(item) {
item.classList.add('removing');
});
// Ждем окончания анимации, затем удаляем из Masonry
setTimeout(function() {
msnry.remove(itemsToRemove);
msnry.layout();
}, 300);
Особенности:
.removing для управления анимацией
через CSS.Часто требуется удалять элементы динамически по определённым критериям, например, по классу или атрибуту:
var items = grid.querySelectorAll('.grid-item');
items.forEach(function(item) {
if (item.dataset.status === 'obsolete') {
msnry.remove(item);
}
});
msnry.layout();
Примечания:
layout()
один раз для оптимизации производительности.При удалении десятков или сотен элементов одновременно есть несколько рекомендаций:
Группировка операций
remove для каждого.Использование remove с NodeList или
массивом
Минимизация вызова layout()
layout() только один раз после удаления всех
элементов, чтобы избежать лишних перерисовок.var itemsToRemove = Array.from(grid.querySelectorAll('.grid-item.remove-me'));
msnry.remove(itemsToRemove);
msnry.layout();
msnry.items), который автоматически обновляется при
использовании remove.remove, а вручную
через removeChild или innerHTML = '',
необходимо вызвать reloadItems() и
layout():grid.innerHTML = ''; // удаление вручную
msnry.reloadItems();
msnry.layout();
append и remove с
корректными вызовами layout() для оптимизации
производительности.Эти приёмы позволяют управлять сеткой Masonry гибко и эффективно, обеспечивая корректное удаление множества элементов с минимальными затратами ресурсов и плавной анимацией.