Библиотека Muuri управляет сеткой DOM-элементов, каждый из которых представлен объектом Item. Item — это внутренний объект Muuri, который инкапсулирует:
Каждый элемент сетки автоматически превращается в экземпляр Item при инициализации Muuri.
const grid = new Muuri('.grid');
Если внутри контейнера .grid находятся элементы
.item, для каждого из них будет создан объект Item.
Схематически структура выглядит следующим образом:
Grid
├── Item
│ ├── DOM Element
│ ├── Layout data
│ ├── Position
│ ├── Visibility state
│ ├── Drag state
│ └── Animation handlers
├── Item
└── Item
Grid управляет коллекцией Item, а Item отвечает за собственное состояние.
Muuri не требует сложной HTML-разметки. Минимальная структура:
<div class="grid">
<div class="item">
<div class="item-content">
Контент
</div>
</div>
</div>
Распространённая структура:
grid
└── item
└── item-content
Muuri изменяет CSS-свойства контейнера .item,
например:
transformleft / topopacityЭто обеспечивает независимость визуального контента от позиционирования.
Каждый элемент сетки представлен экземпляром класса
Item.
Получение всех элементов:
const items = grid.getItems();
Получение первого элемента:
const item = grid.getItems()[0];
Объект Item содержит ряд внутренних данных.
| Свойство | Назначение |
|---|---|
_element |
DOM-элемент |
_grid |
ссылка на родительский Grid |
_width |
ширина |
_height |
высота |
_left |
координата X |
_top |
координата Y |
_isActive |
участвует ли элемент в layout |
_isVisible |
отображается ли элемент |
_isDragging |
находится ли в состоянии drag |
Часть этих свойств является внутренней и не предназначена для прямого изменения.
Каждый Item напрямую связан с DOM-узлом.
Получение DOM-элемента:
item.getElement();
Пример:
const element = item.getElement();
console.log(element);
Этот метод используется, когда необходимо изменить содержимое или стили элемента.
Muuri использует CSS transforms для перемещения элементов.
Типичное состояние элемента:
.item {
position: absolute;
transform: translate(120px, 200px);
}
Координаты хранятся внутри Item:
Item
├── x (left)
└── y (top)
Muuri вычисляет:
После расчёта применяется transform.
Размеры элемента определяются на основе DOM.
Muuri вычисляет:
Размеры используются для построения layout.
Получение размеров:
item.getWidth();
item.getHeight();
Пример:
const width = item.getWidth();
const height = item.getHeight();
Эти данные используются при:
Элемент может быть активным или неактивным.
Активный элемент участвует в layout.
Неактивный:
Проверка:
item.isActive();
Muuri использует это состояние при:
Item может быть:
Скрытие элемента:
grid.hide(item);
Показ:
grid.show(item);
Проверка состояния:
item.isVisible();
Muuri использует анимацию изменения прозрачности:
opacity: 1 → 0
После скрытия элемент может:
Если включена функция drag, Item получает дополнительные состояния.
Включение drag:
const grid = new Muuri('.grid', {
dragEnabled: true
});
Во время перетаскивания Item содержит:
Item
├── isDragging
├── dragStartPosition
├── dragCurrentPosition
└── dragContainer
Метод проверки:
item.isDragging();
Muuri обновляет позицию элемента в реальном времени.
Каждый Item имеет позицию в массиве элементов Grid.
Получение индекса:
item.getIndex();
Пример:
const index = item.getIndex();
Индекс используется для:
Muuri позволяет хранить пользовательские данные в DOM.
Пример:
<div class="item" data-category="fruit">
Доступ к данным:
const element = item.getElement();
const category = element.dataset.category;
Эти данные часто используются при фильтрации:
grid.filter(item => {
return item.getElement().dataset.category === 'fruit';
});
Жизненный цикл элемента включает несколько этапов.
При инициализации Grid:
const grid = new Muuri('.grid');
Каждый DOM-элемент превращается в Item.
Muuri вычисляет:
Алгоритм размещает элементы.
Элемент получает координаты.
Muuri применяет transform и transition.
При изменениях:
Muuri пересчитывает layout.
Удаление элемента:
grid.remove(item);
Item удаляется из:
Grid управляет массивом Item.
Получение:
grid.getItems();
Возвращается массив:
[
Item,
Item,
Item
]
Работа с элементами:
const items = grid.getItems();
items.forEach(item => {
console.log(item.getElement());
});
Layout-движок Muuri использует данные Item:
Item
├── width
├── height
├── margin
├── position
└── visibility
Алгоритм размещения:
Это позволяет создавать плотные и адаптивные сетки.
Muuri использует встроенную систему анимации.
Каждый Item может анимировать:
Пример анимации layout:
grid.layout({
duration: 300,
easing: 'ease'
});
Во время layout каждый Item получает собственную анимацию transform.
Muuri создаёт вспомогательные контейнеры для drag-операций.
Структура может выглядеть так:
grid
└── item
└── item-content
При drag элемент может временно перемещаться в отдельный контейнер.
dragContainer
└── item
Это предотвращает проблемы с overflow и stacking.
Большинство операций выполняется через Grid.
const item = grid.getItem(element);
grid.add(element);
Muuri создаст новый Item.
grid.remove(item);
grid.sort((a, b) => {
return a.getWidth() - b.getWidth();
});
Muuri кэширует некоторые данные Item:
Это повышает производительность при частых layout-операциях.
Обновление кэша:
grid.refreshItems();
После этого Muuri пересчитает размеры.
Item выполняет роль адаптера между DOM и алгоритмом layout.
DOM Element
↓
Item
↓
Grid Layout
Item изолирует:
Благодаря этому Muuri может: