Библиотека Muuri предназначена для создания динамических сеток элементов с возможностью перетаскивания, сортировки и фильтрации. Основная идея — размещение карточек внутри контейнера, где библиотека автоматически рассчитывает позиции элементов и управляет их анимацией.
Минимальный рабочий пример состоит из трёх частей:
Muuri не требует сложной настройки. Достаточно подключить библиотеку и указать контейнер сетки.
Самый простой способ — использование CDN:
<script src="https://unpkg.com/muuri@0.9.5/dist/muuri.min.js"></script>
Подключение размещается перед закрывающим тегом
</body> либо после разметки сетки.
Альтернативный способ — установка через npm:
npm install muuri
Использование в модульном проекте:
import Muuri from 'muuri';
В учебных примерах чаще применяется CDN-подключение, поскольку оно не требует сборщика модулей.
Muuri работает с контейнером сетки и дочерними элементами. Контейнер определяет область, в которой размещаются карточки.
Минимальная структура:
<div class="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 class="item">
<div class="item-content">4</div>
</div>
</div>
В структуре используются два уровня:
.item контейнер элемента сетки, которым
управляет Muuri
.item-content внутреннее содержимое
карточки
Такое разделение важно, поскольку Muuri применяет трансформации к
внешнему контейнеру .item, а стили и анимации можно
размещать внутри .item-content.
Без CSS сетка не будет выглядеть корректно. Muuri позиционирует
элементы через position: absolute, поэтому контейнер должен
быть позиционирован относительно.
.grid {
position: relative;
}
.item {
width: 200px;
height: 120px;
}
.item-content {
width: 100%;
height: 100%;
background: #3498db;
color: white;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
border-radius: 6px;
}
Ключевые моменты:
.grid должен иметь
position: relative.item.item-contentMuuri самостоятельно вычисляет координаты элементов и перемещает их с помощью CSS-трансформаций.
После подготовки разметки и стилей создаётся экземпляр сетки.
var grid = new Muuri('.grid');
Происходит следующее:
.grid.itemПолный пример:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Muuri Example</title>
<style>
.grid {
position: relative;
}
.item {
width: 200px;
height: 120px;
margin: 10px;
}
.item-content {
width: 100%;
height: 100%;
background: #3498db;
color: white;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
border-radius: 6px;
}
</style>
</head>
<body>
<div class="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 class="item"><div class="item-content">4</div></div>
</div>
<script src="https://unpkg.com/muuri@0.9.5/dist/muuri.min.js"></script>
<script>
var grid = new Muuri('.grid');
</script>
</body>
</html>
После загрузки страницы элементы автоматически выстраиваются в адаптивную сетку.
Muuri использует алгоритм плотной сетки. Он размещает элементы слева направо и сверху вниз, стараясь максимально эффективно заполнить пространство контейнера.
Алгоритм учитывает:
Если карточки имеют разную высоту, сетка автоматически перестраивается.
Пример элементов разного размера:
.item.large {
height: 200px;
}
<div class="item large">
<div class="item-content">Big</div>
</div>
Muuri корректно перераспределяет элементы без перекрытий.
Одна из ключевых возможностей библиотеки — drag & drop.
Перетаскивание включается через опцию dragEnabled.
var grid = new Muuri('.grid', {
dragEnabled: true
});
Теперь элементы можно перемещать мышью.
Во время перетаскивания Muuri выполняет несколько действий:
Эта логика реализована внутри библиотеки и не требует дополнительного кода.
Muuri автоматически анимирует изменения расположения элементов.
Когда элемент:
происходит плавное перемещение карточек.
Настройка анимации выполняется через параметр
layoutDuration.
var grid = new Muuri('.grid', {
layoutDuration: 300,
layoutEasing: 'ease'
});
Основные параметры:
layoutDuration длительность анимации перестроения (в миллисекундах)
layoutEasing тип easing-функции CSS
Пример:
var grid = new Muuri('.grid', {
layoutDuration: 500,
layoutEasing: 'ease-in-out'
});
Muuri предоставляет API для работы с элементами.
Получение всех элементов:
var items = grid.getItems();
items содержит массив объектов MuuriItem.
Каждый объект содержит методы управления карточкой:
Пример доступа к DOM-элементу:
var element = items[0].getElement();
Новые карточки можно добавлять динамически.
HTML-элемент создаётся стандартным способом:
var element = document.createElement('div');
element.className = 'item';
element.innerHTML = `
<div class="item-content">New</div>
`;
Добавление в Muuri:
grid.add(element);
Muuri:
Удаление производится методом remove.
var items = grid.getItems();
grid.remove(items[0], {
removeElements: true
});
Опция removeElements: true означает удаление
DOM-элемента из документа.
Если параметр не указан, элемент лишь исключается из сетки, но остаётся в DOM.
Иногда требуется вручную инициировать перерасчёт расположения.
Это выполняется методом layout().
grid.layout();
Такой вызов полезен в случаях:
Частая проблема — изменение высоты карточек после загрузки изображений.
Если Muuri вычисляет размеры до загрузки изображения, сетка может выглядеть неправильно.
Решение — пересчитать сетку после загрузки:
window.addEventListener('load', function() {
grid.layout();
});
Более точный подход — использование библиотеки imagesLoaded:
imagesLoaded('.grid', function() {
grid.layout();
});
Это гарантирует корректные размеры элементов.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
.grid {
position: relative;
}
.item {
width: 200px;
height: 120px;
margin: 10px;
}
.item-content {
width: 100%;
height: 100%;
background: #3498db;
color: white;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
border-radius: 6px;
}
</style>
</head>
<body>
<div class="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 class="item">
<div class="item-content">4</div>
</div>
</div>
<script src="https://unpkg.com/muuri@0.9.5/dist/muuri.min.js"></script>
<script>
var grid = new Muuri('.grid', {
dragEnabled: true,
layoutDuration: 400,
layoutEasing: 'ease'
});
</script>
</body>
</html>
После загрузки страницы формируется интерактивная сетка, в которой: