В библиотеке Muuri управление порядком элементов является одной из ключевых функций, позволяющей создавать динамичные, интерактивные сетки. Элементы сетки могут быть перемещены пользователем или программно, а библиотека обеспечивает плавное обновление расположения и визуальные эффекты.
Сетку создают через конструктор
Muuri(container, options). Для контроля порядка важно
понимать следующие параметры:
const grid = new Muuri('.grid', {
dragEnabled: true,
layoutOnInit: true
});
Сортировка элементов может выполняться через метод sort,
принимающий функцию сравнения или ключ.
grid.sort((itemA, itemB) => {
return itemA.getElement().dataset.order - itemB.getElement().dataset.order;
});
В этом примере порядок элементов задается через атрибут
data-order.
Muuri предоставляет методы для точного управления:
move(item, toIndex, [options]) –
перемещает элемент на указанную позицию.
const firstItem = grid.getItems()[0];
grid.move(firstItem, 5, { layout: { duration: 400, easing: 'ease' } });swap(itemA, itemB, [options]) –
меняет местами два элемента.
const items = grid.getItems();
grid.swap(items[0], items[1], { layout: { duration: 300 } });send(item, toGrid, [options]) –
перемещает элемент между разными сетками.
Эти методы автоматически вызывают перерасчет расположения
(layout) и применяют анимацию для плавного перехода.
Muuri поддерживает сортировку не только по числовым или строковым атрибутам, но и по функциям:
grid.sort((itemA, itemB) => {
const nameA = itemA.getElement().querySelector('.name').textContent.toLowerCase();
const nameB = itemB.getElement().querySelector('.name').textContent.toLowerCase();
return nameA.localeCompare(nameB);
});
Сортировка может быть стабильной, что важно при работе с фильтрацией и динамическими добавлениями элементов.
Перетаскивание элементов пользователем автоматически обновляет
порядок внутри сетки. Для отслеживания изменений можно использовать
событие move:
grid.on('move', (items) => {
items.forEach(item => {
console.log('Новый индекс:', grid.getItems().indexOf(item));
});
});
Таким образом, можно синхронизировать визуальный порядок с данными в базе или локальном хранилище.
Muuri позволяет комбинировать сортировку и фильтрацию, сохраняя контроль над порядком элементов:
grid.filter(item => item.getElement().classList.contains('active'));
grid.sort((a, b) => a.getElement().dataset.rank - b.getElement().dataset.rank);
Фильтрация скрывает элементы, а сортировка переставляет видимые. После изменения фильтрации порядок восстанавливается, а скрытые элементы остаются на своих местах в исходной структуре.
Добавление:
const newItem = grid.add([document.createElement('div')], { layout: true });
Можно сразу указать layout: true для плавного включения
элемента в сетку.
Удаление:
const item = grid.getItems()[2];
grid.remove(item, { removeElements: true, layout: { duration: 300 } });Удаление элементов корректно обновляет индексы остальных элементов, сохраняя согласованность порядка.
Параметры анимации задаются через объект layout:
grid.layout({
duration: 500,
easing: 'ease-in-out',
queue: false
});
Для реализации «drag-and-drop» с запоминанием порядка можно сохранять индексы:
grid.on('move', (items) => {
const order = grid.getItems().map(item => item.getElement().dataset.id);
localStorage.setItem('gridOrder', JSON.stringify(order));
});
При загрузке страницы порядок восстанавливается через метод
sort с сохраненными значениями.
Контроль порядка в Muuri сочетает программное управление, пользовательское перетаскивание, фильтрацию и сортировку, обеспечивая гибкую и интерактивную организацию элементов на любой странице. Понимание этих методов позволяет создавать сложные сетки с динамическим поведением и плавной анимацией, идеально подходящие для интерфейсов типа галерей, каталогов и интерактивных дашбордов.