Muuri — это современная библиотека для создания динамических, отзывчивых и анимированных сеток элементов в JavaScript. Она сочетает возможности управления положением элементов, сортировки, фильтрации и перетаскивания (drag-and-drop), обеспечивая гибкость интерфейсов без необходимости написания сложного кода с нуля.
Суть Muuri заключается в управлении коллекцией элементов внутри контейнера, где каждый элемент позиционируется и анимируется автоматически. Элементы сетки могут изменять порядок, размер или состояние без нарушения общей структуры.
Для работы с Muuri требуется подключение скрипта библиотеки и создание контейнера с элементами:
<div id="grid">
<div class="item"><div class="item-content">1</div></div>
<div class="item"><div class="item-content">2</div></div>
<div class="item"><div class="item-content">3</div></div>
</div>
Инициализация происходит через объект Muuri:
const grid = new Muuri('#grid', {
dragEnabled: true,
layout: {
fillGaps: true
},
sortData: {
id: (item) => parseInt(item.getElement().textContent, 10)
}
});
Ключевые моменты при инициализации:
dragEnabled: true — позволяет перетаскивать
элементы.layout.fillGaps: true — автоматически заполняет пустые
места при удалении или перемещении элементов.sortData — позволяет задавать пользовательские функции
сортировки.Muuri предоставляет методы для добавления, удаления, фильтрации и сортировки элементов.
const newItem = document.createElement('div');
newItem.className = 'item';
newItem.innerHTML = '<div class="item-content">4</div>';
grid.add(newItem); // Добавление
grid.remove(newItem, { removeElements: true }); // Удаление
Особенности:
add() принимает один элемент или массив
элементов.remove() может удалять элементы только из сетки
или полностью из DOM, если передан флаг
removeElements: true.Сортировка осуществляется через метод sort():
grid.sort((a, b) => {
const aValue = parseInt(a.getElement().textContent, 10);
const bValue = parseInt(b.getElement().textContent, 10);
return aValue - bValue;
});
Примечание: Muuri позволяет применять несколько
критериев сортировки одновременно, используя объект
sortData и ключи для каждого критерия.
Фильтрация элементов выполняется через метод
filter():
grid.filter(item => parseInt(item.getElement().textContent, 10) % 2 === 0);
true для
отображаемых элементов.Одной из сильных сторон Muuri является поддержка drag-and-drop с плавной анимацией. Элементы сетки перемещаются с естественной инерцией, а сетка перестраивается автоматически.
grid.on('dragReleaseEnd', () => {
console.log('Элемент отпущен и сетка обновлена');
});
Настройка поведения перетаскивания:
dragSort: true — разрешает менять порядок элементов при
перетаскивании.dragSortInterval — интервал проверки позиции для
обновления сетки.dragReleaseDuration — длительность анимации при
отпускании элемента.Muuri поддерживает адаптивные сетки, автоматически подстраивающиеся под размер контейнера и элементы.
const grid = new Muuri('.grid', {
layout: {
rounding: false,
fillGaps: true
}
});
rounding: false — отключает округление координат, что
полезно для точного позиционирования.fillGaps: true — заполняет свободное пространство при
изменении размеров элементов.Адаптивность достигается сочетанием CSS и параметров сетки. Например,
использование flex или grid для контейнера и
фиксированных размеров элементов позволяет Muuri плавно перестраивать
сетку при изменении ширины окна.
Muuri поддерживает множество событий, которые помогают отслеживать изменения состояния сетки:
layoutStart и layoutEnd — начало и
окончание перестройки сетки.dragStart, dragMove,
dragReleaseStart, dragReleaseEnd — управление
перетаскиванием.add, remove, show,
hide — управление элементами.Пример использования событий:
grid.on('layoutEnd', () => {
console.log('Сетка обновлена и анимирована');
});
События позволяют реализовать интерактивные интерфейсы и динамически реагировать на действия пользователя.
Muuri оптимизирован для больших коллекций элементов:
layout.duration и layout.easing.Для крупных проектов рекомендуется:
layout(true) после массовых изменений для
мгновенного перераспределения без анимации.Muuri легко комбинируется с:
v-for и привязку к сетке
после рендеринга.ViewChildren и прямую
инициализацию Muuri.Использование Muuri с современными фреймворками позволяет создавать сложные и интерактивные интерфейсы, такие как галереи, доски задач и адаптивные панели с элементами, которые можно сортировать и перетаскивать.