Жизненный цикл элемента в Muuri начинается с момента его появления в
DOM-структуре и регистрации внутри экземпляра сетки. Внутренне каждый
элемент представлен объектом Item, который управляет
позиционированием, состояниями, анимацией и взаимодействием с другими
элементами.
При создании сетки Muuri сканирует контейнер и превращает найденные элементы в управляемые объекты.
const grid = new Muuri('.grid');
Контейнер .grid становится управляющей областью, а все
дочерние элементы автоматически превращаются в элементы 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>
После инициализации происходит несколько внутренних этапов:
ItemКаждый Item хранит:
Получение всех элементов:
const items = grid.getItems();
Получение конкретного элемента по DOM-узлу:
const item = grid.getItem(document.querySelector('.item'));
Объект Item становится центральной сущностью жизненного
цикла.
Элемент Muuri проходит несколько ключевых состояний:
| Состояние | Описание |
|---|---|
| created | элемент создан и зарегистрирован |
| active | элемент участвует в раскладке |
| hidden | элемент скрыт |
| showing | выполняется анимация появления |
| hiding | выполняется анимация скрытия |
| positioning | элемент перемещается |
| dragging | элемент перетаскивается |
Muuri управляет переходами между этими состояниями автоматически.
Проверка состояния:
item.isVisible();
item.isShowing();
item.isHiding();
item.isDragging();
Это позволяет контролировать логику интерфейса и синхронизировать действия.
Добавление — один из ключевых этапов жизненного цикла.
grid.add(element);
Добавление массива элементов:
grid.add([element1, element2]);
Пример динамического создания:
const element = document.createElement('div');
element.classList.add('item');
element.innerHTML = `
<div class="item-content">New</div>
`;
grid.add(element);
После добавления Muuri выполняет:
ItemЕсли включена анимация layout, элемент плавно перемещается на своё место.
Элемент может существовать в сетке, но быть скрытым. Переход в
видимое состояние выполняется методом show.
grid.show(item);
Или для нескольких элементов:
grid.show([item1, item2]);
Процесс включает:
hidden → showingactiveMuuri автоматически применяет классы:
.muuri-item-shown
.muuri-item-visible
Это позволяет управлять стилями через CSS.
Скрытие элемента не удаляет его из сетки. Он просто исключается из layout.
grid.hide(item);
Массовое скрытие:
grid.hide(grid.getItems());
Процесс:
visible → hidinghiddenПосле завершения элемент остаётся в DOM, но не влияет на расположение других элементов.
CSS-классы:
.muuri-item-hidden
Muuri автоматически управляет позиционированием через layout-алгоритм.
Принудительный пересчет layout:
grid.layout();
Каждый элемент получает новые координаты:
transform: translate(x, y)
Внутренний процесс перемещения:
positioningАнимация выполняется через GPU-ускоренные трансформации.
Если включено перетаскивание:
const grid = new Muuri('.grid', {
dragEnabled: true
});
Элемент проходит дополнительные состояния.
Срабатывает событие:
grid.on('dragStart', function(item) {
console.log('Drag started');
});
В этот момент:
Во время движения:
grid.on('dragMove', function(item) {
console.log('Moving');
});
Muuri постоянно:
grid.on('dragEnd', function(item) {
console.log('Drag finished');
});
Процесс завершения:
Изменение порядка элементов — отдельный этап жизненного цикла.
Сортировка:
grid.sort(function(a, b) {
return a.getElement().dataset.order - b.getElement().dataset.order;
});
После сортировки:
ItemФильтрация временно скрывает элементы.
grid.filter(function(item) {
return item.getElement().dataset.category === 'news';
});
Muuri:
show или hideТаким образом элементы проходят те же стадии жизненного цикла.
Удаление — финальная стадия жизненного цикла.
grid.remove(item);
Удаление нескольких элементов:
grid.remove([item1, item2]);
Внутренний процесс:
Можно отключить удаление DOM-элемента:
grid.remove(item, { removeElements: false });
Если содержимое элемента изменилось, необходимо обновить размеры.
grid.refreshItems().layout();
Либо для конкретного элемента:
item.refreshDimensions();
grid.layout();
Этапы:
Без обновления размеры будут некорректными.
Muuri предоставляет большое количество событий.
grid.on('layoutStart', function(items) {
console.log('Layout start');
});
Срабатывает перед перерасчетом сетки.
grid.on('layoutEnd', function(items) {
console.log('Layout finished');
});
Фиксация новой структуры сетки.
grid.on('showStart', function(items) {});
grid.on('showEnd', function(items) {});
grid.on('hideStart', function(items) {});
grid.on('hideEnd', function(items) {});
Позволяют полностью контролировать поведение перетаскивания.
Каждый Item содержит несколько внутренних
компонентов:
Item
├── element
├── layout
├── drag
├── visibility
├── animation
DOM-узел.
Координаты и размеры.
Состояние перетаскивания.
Состояние отображения.
Данные текущей анимации.
Элемент перестаёт существовать для Muuri, когда:
removeУничтожение сетки:
grid.destroy();
После этого:
Объекты Item освобождаются сборщиком мусора JavaScript,
завершая жизненный цикл элемента внутри Muuri.