Muuri — это высокоэффективная библиотека для работы с сетки элементов (Grid) в JavaScript, которая поддерживает динамическое перемещение, сортировку и фильтрацию элементов. Одной из ключевых возможностей является перетаскивание элементов между разными сетками с сохранением анимации и состояния.
Для начала важно понять, что каждый Grid в Muuri управляет своим набором элементов и хранит их состояние отдельно. Когда требуется переместить элемент между сетками, необходимо выполнить следующие шаги:
Извлечение элемента из исходной сетки Метод
remove позволяет удалить элемент из Grid, при этом
возвращается объект элемента, который можно использовать для добавления
в другой Grid:
const removedItem = sourceGrid.getItem(element);
sourceGrid.remove(removedItem, { removeElements: false });
Параметр removeElements: false гарантирует, что сам
DOM-элемент не будет удалён со страницы, а останется доступным для новой
сетки.
Добавление элемента в целевую сетку Метод
add целевой сетки принимает один или несколько
элементов:
targetGrid.add(removedItem.getElement());
После добавления элемент автоматически интегрируется в структуру Grid с анимацией, если она включена.
Сохранение состояния и позиции элементов Для
корректного отображения после перемещения полезно вызвать метод
refreshItems и layout у обеих сеток:
sourceGrid.refreshItems().layout();
targetGrid.refreshItems().layout();
Это гарантирует, что сетки пересчитают позиции оставшихся и новых элементов, сохраняя плавность анимации.
Muuri поддерживает возможность перетаскивания элементов между
разными Grid с помощью опции dragSort. Настройка
выглядит следующим образом:
const grid1 = new Muuri('.grid1', {
dragEnabled: true,
dragSort: ['.grid2']
});
const grid2 = new Muuri('.grid2', {
dragEnabled: true,
dragSort: ['.grid1']
});
dragEnabled: true — разрешает перетаскивание элементов
внутри Grid.dragSort: [селектор] — указывает, что элементы могут
быть перемещены в Grid, соответствующий указанному селектору. Можно
указать несколько сеток.Элементы будут плавно анимироваться при перемещении, автоматически обновляя позиции в обоих Grid.
Muuri позволяет управлять поведением элементов во время и после перемещения:
grid1.on('dragEnd', (item) => {
console.log('Элемент перемещен:', item.getElement());
});
const grid1 = new Muuri('.grid1', {
dragEnabled: true,
dragSort: ['.grid2'],
dragSortPredicate: (item, target, sibling) => {
// Разрешаем перемещение только если target пуст или последний элемент
return target.getItems().length === 0 || sibling === null;
}
});
Список задач Kanban Каждая колонка реализована
как отдельный Grid. Перетаскивание карточек между колонками выполняется
через dragSort, при этом порядок карточек сохраняется
анимированно.
Галерея изображений с категориями Изображения
можно перемещать между категориями, каждая из которых представляет
отдельный Grid. Добавление и удаление изображений из сеток выполняется
через методы remove и add.
Динамическое создание Grid Иногда требуется перемещать элементы в Grid, который создаётся на лету:
const newGrid = new Muuri(newContainer, { dragEnabled: true });
removedItems.forEach(item => newGrid.add(item.getElement()));
newGrid.layout();
Это позволяет строить гибкие интерфейсы с множеством динамических контейнеров.
refreshItems только после завершения
серии изменений, чтобы избежать лишних перерасчётов.dragSortInterval для контроля частоты
обновления сеток при перетаскивании элементов.| Метод | Назначение |
|---|---|
getItem(element) |
Получение объекта элемента Grid по DOM-узлу |
remove(item, { removeElements: false }) |
Удаление элемента из Grid без удаления из DOM |
add(element) |
Добавление DOM-элемента в Grid |
refreshItems() |
Обновление внутреннего состояния элементов |
layout() |
Пересчет и анимация расположения элементов |
dragSort |
Настройка разрешенных сеток для перетаскивания |
dragSortPredicate |
Фильтр допустимых перемещений элементов |
Эти инструменты позволяют строить интерактивные интерфейсы с динамическим перемещением элементов, сохраняя плавность анимации и корректное управление состоянием всех сеток.