Удаление элементов в сетке — одна из ключевых операций при работе с Packery. Она используется при динамическом обновлении интерфейса: удалении карточек, закрытии уведомлений, фильтрации контента, управлении списками и других интерактивных сценариях.
Packery поддерживает корректное удаление элементов с последующим перераспределением оставшихся элементов в сетке. После удаления библиотека автоматически пересчитывает позиции и устраняет пустые пространства.
removeУдаление элементов выполняется методом remove. Он
удаляет переданные DOM-элементы из системы управления Packery.
Синтаксис:
pckry.remove( elements )
Параметр elements может принимать:
querySelectorAllПример удаления одного элемента:
var elem = document.querySelector('.grid-item');
pckry.remove(elem);
После вызова метода Packery удаляет элемент из внутреннего массива управляемых элементов.
Метод remove не выполняет автоматическую
переракладку элементов. Для корректного обновления интерфейса
требуется вызвать layout().
pckry.remove(elem);
pckry.layout();
Последовательность действий:
HTML:
<div class="grid">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
</div>
Jav * aScript:
var grid = document.querySelector('.grid');
var pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10
});
var item = grid.querySelector('.grid-item');
pckry.remove(item);
pckry.layout();
После выполнения:
Метод remove может принимать коллекцию элементов.
var items = document.querySelectorAll('.grid-item.remove');
pckry.remove(items);
pckry.layout();
В этом случае:
layoutЭто эффективнее, чем удалять каждый элемент отдельно.
Элементы также можно передать в виде массива.
var items = [
document.querySelector('#item1'),
document.querySelector('#item2')
];
pckry.remove(items);
pckry.layout();
На практике удаление часто привязывается к кнопкам или другим элементам интерфейса.
HTML:
<div class="grid-item">
<button class="remove">×</button>
</div>
Jav * aScript:
grid.addEventListener('click', function(event) {
if (!event.target.matches('.remove')) return;
var itemElem = event.target.closest('.grid-item');
pckry.remove(itemElem);
pckry.layout();
});
Алгоритм работы:
.grid-itemremove()Для более плавного интерфейса элементы можно сначала анимировать, а затем удалить.
CSS:
.grid-item {
transition: opacity 0.4s;
}
.grid-item.is-removing {
opacity: 0;
}
Jav * aScript:
var item = document.querySelector('.grid-item');
item.classList.add('is-removing');
item.addEventListener('transitionend', function() {
pckry.remove(item);
pckry.layout();
});
Последовательность:
Метод remove удаляет элементы из DOM
автоматически. Дополнительный вызов
element.remove() не требуется.
Внутри Packery выполняются два действия:
itemsИногда требуется временно удалить элементы из сетки на основе условий.
Пример удаления элементов определённой категории:
var items = grid.querySelectorAll('.grid-item[data-type="old"]');
pckry.remove(items);
pckry.layout();
После этого сетка будет состоять только из оставшихся элементов.
Удалённые элементы можно сохранить и позже добавить обратно с помощью
appended.
var removedItem;
var item = document.querySelector('.grid-item');
removedItem = item;
pckry.remove(item);
pckry.layout();
Позднее:
grid.appendChild(removedItem);
pckry.appended(removedItem);
Когда вызывается remove, Packery выполняет несколько
операций:
ItemitemsПосле вызова layout() происходит:
Если требуется удалить большое количество элементов, важно избегать
множественных вызовов layout.
Неправильный вариант:
items.forEach(function(item) {
pckry.remove(item);
pckry.layout();
});
Это вызывает перерасчёт для каждого элемента.
Оптимальный вариант:
pckry.remove(items);
pckry.layout();
Переракладка выполняется один раз.
Для полного удаления всех элементов можно использовать следующий подход:
var items = grid.querySelectorAll('.grid-item');
pckry.remove(items);
pckry.layout();
После выполнения контейнер останется пустым.
Иногда элементы удаляются через определённое время.
setTimeout(function() {
var item = document.querySelector('.grid-item');
pckry.remove(item);
pckry.layout();
}, 2000);
Этот подход используется для:
Удаление часто используется совместно с другими операциями:
| Операция | Метод |
|---|---|
| добавление элементов | appended() |
| перерасчёт сетки | layout() |
| сортировка | shiftLayout() |
| управление перетаскиванием | bindDraggabillyEvents() |
Типичный цикл динамического интерфейса:
Перед удалением желательно проверять существование элемента.
if (item) {
pckry.remove(item);
pckry.layout();
}
Это предотвращает ошибки при работе с динамическими интерфейсами.
layout()pckry.remove(item);
Без переракладки остаются пустые пространства.
Правильный вариант:
pckry.remove(item);
pckry.layout();
item.remove();
В этом случае Packery не узнаёт об удалении элемента, и внутреннее состояние нарушается.
Правильный вариант:
pckry.remove(item);
items.forEach(function(item) {
pckry.remove(item);
pckry.layout();
});
Следует удалять элементы группой.
Удаление элементов Packery активно применяется в следующих интерфейсах:
Благодаря автоматическому перераспределению элементов сетка сохраняет плотную упаковку без пустых областей.
После удаления элемента Packery выполняет перераспределение по принципу bin-packing:
Это обеспечивает компактное расположение элементов без ручного управления координатами.