Для корректной работы библиотеки Muuri необходимо создать базовую HTML-структуру, которая будет содержать контейнер и элементы сетки (items). Минимальная разметка состоит из контейнера с уникальным идентификатором или классом и набором дочерних элементов, которые будут позиционироваться и управляться библиотекой.
<div id="grid">
<div class="item">Элемент 1</div>
<div class="item">Элемент 2</div>
<div class="item">Элемент 3</div>
<div class="item">Элемент 4</div>
</div>
#grid — контейнер сетки. Может быть идентификатором
(id) или классом (class). Именно к этому
контейнеру будет привязана инициализация Muuri..item — каждый элемент сетки. Muuri автоматически
управляет их позиционированием и анимацией.Важно: все элементы сетки должны быть непустыми
блоками, чтобы библиотека могла корректно определять размеры и
положение. Даже если элемент будет содержать только текст, он должен
быть в отдельном блоке <div>.
Для работы Muuri требуется подключение его скрипта и стилей (если используется CSS для базового оформления элементов). Минимальный способ — подключение через CDN:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/muuri@0.10.5/dist/muuri.min.css">
<script src="https://cdn.jsdelivr.net/npm/muuri@0.10.5/dist/muuri.min.js"></script>
После подключения скрипта создаётся объект Muuri, который управляет контейнером:
const grid = new Muuri('#grid', {
layout: {
fillGaps: true
}
});
Ключевые моменты:
'#grid' — селектор контейнера
сетки.layout.fillGaps отвечает за заполнение пустых
мест в сетке, создавая плотное расположение элементов.Можно добавлять дополнительные опции для управления поведением сетки:
const grid = new Muuri('#grid', {
dragEnabled: true, // возможность перетаскивания элементов
dragSort: true, // сортировка при перетаскивании
layoutDuration: 400, // время анимации перестановки элементов
layoutEasing: 'ease' // тип анимации
});
<div class="item">
<div class="item-content">Содержимое</div>
</div>
.item-content позволяет отделить визуальное оформление
от самой логики Muuri. Это облегчает стилизацию и добавление
событий.Контейнер и элементы должны быть видимыми при
инициализации. Muuri рассчитывает размеры элементов только
после того, как они полностью загружены и отображаются. Если элементы
скрыты (например, через display: none), позиции могут
вычислиться неправильно.
Использование классов вместо идентификаторов удобно при наличии нескольких сеток на странице:
<div class="grid">
<div class="item">Элемент A</div>
<div class="item">Элемент B</div>
</div>
<div class="grid">
<div class="item">Элемент C</div>
<div class="item">Элемент D</div>
</div>
Инициализация нескольких сеток:
const grids = document.querySelectorAll('.grid');
grids.forEach(gridElement => {
new Muuri(gridElement, { layout: { fillGaps: true } });
});
Чтобы сетка выглядела правильно и элементы не накладывались друг на друга, рекомендуется добавить базовые стили:
#grid {
position: relative;
}
.item {
position: absolute;
width: 200px;
height: 150px;
margin: 10px;
background-color: #ccc;
display: flex;
align-items: center;
justify-content: center;
}
position: absolute; — обязательна для Muuri, чтобы
библиотека могла управлять расположением элементов.flex внутри .item позволяет
выравнивать содержимое по центру.Эта минимальная структура является основой для любых проектов с Muuri. Она позволяет создавать динамические сетки, перетаскиваемые элементы, фильтры и сортировку без дополнительных сложных настроек. Любые расширения (анимации, динамическое добавление элементов, адаптивная верстка) строятся на этой базовой разметке и инициализации.