Muuri — это библиотека для организации сетки элементов с динамическим расположением и анимацией. Пакетные операции в Muuri позволяют одновременно управлять группой элементов, что значительно повышает производительность и упрощает код при работе с большими сетками. Ключевой принцип заключается в том, что Muuri позволяет применять действия к множеству элементов сразу, вместо обработки каждого элемента по отдельности.
Для выполнения пакетных операций сначала необходимо определить набор элементов, с которыми будет производиться работа. Muuri предоставляет несколько методов для выбора элементов:
Пример использования:
const allItems = grid.getItems(); // все элементы
const activeItems = grid.getItems().filter(item => item.getElement().classList.contains('active'));
Фильтрация через предикат особенно полезна для динамического управления состояниями элементов без необходимости повторного рендеринга всей сетки.
Для динамических интерфейсов часто требуется добавлять или удалять
несколько элементов одновременно. Muuri предоставляет методы
add() и remove() для этих целей:
Пример пакетного добавления:
const newElements = document.querySelectorAll('.new-item');
grid.add(newElements, { layout: 'instant' });
Пример пакетного удаления:
const itemsToRemove = grid.getItems().filter(item => item.isActive());
grid.remove(itemsToRemove, { removeElements: true, layout: 'animate' });
Важно: параметр removeElements: true
удаляет элементы из DOM полностью, иначе они остаются в документе, но
исключаются из сетки.
Muuri поддерживает групповые операции перемещения и сортировки элементов:
Пример сортировки по пользовательскому атрибуту
data-order:
grid.sort((a, b) => {
return a.getElement().dataset.order - b.getElement().dataset.order;
}, { layout: 'animate' });
Для управления видимостью группы элементов используется метод
filter(), который работает как предикат, возвращающий
true для видимых элементов и false для
скрытых:
grid.filter(item => item.getElement().classList.contains('highlight'));
В результате элементы, не удовлетворяющие условию, анимированно
скрываются, а оставшиеся перестраиваются на сетке. Опции фильтра
позволяют контролировать анимацию и пересчет макета
(layout: 'instant' | 'animate').
Muuri позволяет обновлять несколько элементов одновременно без полной перестройки сетки:
Пример пакетного обновления:
const itemsToRefresh = grid.getItems().filter(item => item.needsUpdate);
grid.refreshItems(itemsToRefresh);
grid.layout();
Метод refreshItems особенно важен при динамическом
изменении контента, чтобы избежать мерцания и некорректного
позиционирования элементов.
Muuri поддерживает плавную анимацию всех пакетных операций. Настройка параметров анимации осуществляется через объект опций:
'ease', 'ease-in-out')'instant' или 'animate'Пример пакетного перемещения с анимацией:
grid.sort((a, b) => a.getElement().dataset.priority - b.getElement().dataset.priority, {
layout: 'animate',
duration: 400,
easing: 'ease-in-out'
});
add, remove, refreshItems можно
сгруппировать и выполнить один раз grid.layout(), чтобы
уменьшить количество пересчетов.layout: 'instant' при массовом
обновлении — ускоряет работу при создании или перезаписи сетки,
а финальную анимацию можно запускать отдельно.Эти подходы позволяют поддерживать плавность интерфейса даже при работе с сотнями элементов одновременно.
Muuri генерирует события на уровне сетки и элементов, что полезно при пакетных операциях:
grid.on('layoutEnd', () => {
console.log('Все элементы обновлены и расположены');
});
Эффективное использование событий позволяет синхронизировать другие части интерфейса с изменениями сетки.