Библиотека Muuri строит интерфейс вокруг управляемой
коллекции элементов — объектов, представляющих DOM-узлы, размещённые в
сетке. Каждый элемент сетки инкапсулируется во внутренний объект
Item, который хранит состояние, позицию, размеры,
DOM-ссылки и служебную информацию.
Коллекции элементов используются для:
Работа с коллекциями является ключевой частью архитектуры Muuri,
поскольку сетка фактически представляет собой управляемый массив
Item.
После инициализации сетки:
const grid = new Muuri('.grid');
каждый дочерний элемент контейнера превращается во внутренний объект
Item.
Структура такого объекта включает:
Muuri хранит элементы во внутреннем массиве:
grid._items
Доступ к нему напрямую не рекомендуется, так как библиотека предоставляет безопасные методы для работы с коллекциями.
getItems()Основной способ получения коллекции элементов.
const items = grid.getItems();
Возвращается массив объектов Item.
Каждый элемент содержит методы:
getElement()getWidth()getHeight()isActive()isVisible()Пример получения DOM-узлов:
const elements = grid.getItems().map(item => item.getElement());
Если известен DOM-элемент:
const element = document.querySelector('.item');
const item = grid.getItem(element);
Muuri сопоставляет DOM-элемент с внутренним объектом
Item.
const firstItem = grid.getItems()[0];
Muuri поддерживает порядок элементов в массиве, соответствующий их текущему порядку в сетке.
Метод getItems() может принимать аргументы:
grid.getItems(elements);
grid.getItems([element1, element2]);
Пример:
const selected = grid.getItems([
document.querySelector('#item1'),
document.querySelector('#item2')
]);
Возвращается массив соответствующих Item.
Muuri позволяет динамически расширять коллекцию.
add()grid.add(element);
Пример:
const newItem = document.createElement('div');
newItem.className = 'item';
grid.add(newItem);
Элемент автоматически:
Itemgrid.add([element1, element2, element3]);
Пример:
const elements = [];
for (let i = 0; i < 5; i++) {
const el = document.createElement('div');
el.className = 'item';
elements.push(el);
}
grid.add(elements);
addМетод принимает объект настроек:
grid.add(elements, {
index: 2,
active: true
});
Параметры:
| Параметр | Назначение |
|---|---|
index |
позиция вставки |
active |
активность элемента |
layout |
выполнить ли перерасчет сетки |
Пример:
grid.add(newItem, {
index: 0
});
Элемент будет вставлен в начало коллекции.
Удаление производится методом remove().
const item = grid.getItems()[0];
grid.remove(item);
Muuri:
const items = grid.getItems().slice(0, 3);
grid.remove(items);
Иногда требуется удалить элемент только из сетки.
grid.remove(item, { removeElements: false });
Теперь элемент:
Muuri позволяет изменять порядок элементов.
move()grid.move(item, newIndex);
Пример:
const item = grid.getItems()[3];
grid.move(item, 0);
Элемент переместится в начало массива.
grid.move(items, index);
Пример:
const items = grid.getItems().slice(0, 2);
grid.move(items, 5);
grid.move(itemA, itemB);
itemA будет перемещен на позицию itemB.
Иногда требуется поменять элементы местами.
Muuri поддерживает режим swap.
grid.move(itemA, itemB, {
action: 'swap'
});
Теперь:
itemA занимает позицию itemBitemB занимает позицию itemAMuuri может скрывать элементы без удаления.
filter()grid.filter(selector);
Пример:
grid.filter('.category-a');
Показываются только элементы с классом category-a.
grid.filter(item => {
const element = item.getElement();
return element.dataset.type === 'fruit';
});
Функция должна вернуть:
true — элемент остаетсяfalse — элемент скрываетсяgrid.filter(() => true);
Все элементы становятся видимыми.
Muuri позволяет сортировать элементы.
sort()grid.sort(compareFunction);
Пример:
grid.sort((a, b) => {
const aValue = a.getElement().dataset.price;
const bValue = b.getElement().dataset.price;
return aValue - bValue;
});
grid.sort((a, b) => {
return a.getElement().textContent.localeCompare(
b.getElement().textContent
);
});
grid.sort((a, b) => {
const priceA = +a.getElement().dataset.price;
const priceB = +b.getElement().dataset.price;
if (priceA !== priceB) {
return priceA - priceB;
}
const nameA = a.getElement().dataset.name;
const nameB = b.getElement().dataset.name;
return nameA.localeCompare(nameB);
});
Muuri различает активные и скрытые элементы.
Получение активных:
const activeItems = grid.getItems().filter(item => item.isActive());
grid.show(items);
Пример:
grid.show(grid.getItems().slice(0, 3));
grid.hide(items);
Пример:
grid.hide(grid.getItems().slice(3, 6));
Элементы остаются в коллекции, но исключаются из расчета сетки.
Muuri поддерживает несколько сеток.
const gridA = new Muuri('.grid-a');
const gridB = new Muuri('.grid-b');
Перемещение:
const item = gridA.getItems()[0];
gridB.add(item.getElement());
gridA.remove(item, { removeElements: false });
Элемент переносится между коллекциями.
Muuri оптимизирован для пакетных изменений.
Пример:
const items = grid.getItems();
items.forEach(item => {
item.getElement().classList.add('updated');
});
grid.refreshItems().layout();
Методы:
refreshItems() — обновление размеровlayout() — перерасчет позицийЕсли содержимое изменилось:
grid.refreshItems();
grid.layout();
Или одной цепочкой:
grid.refreshItems().layout();
Коллекции Muuri являются обычными массивами.
Используются стандартные методы:
forEachgrid.getItems().forEach(item => {
console.log(item.getElement());
});
mapconst ids = grid.getItems().map(item =>
item.getElement().id
);
filterconst largeItems = grid.getItems().filter(item =>
item.getWidth() > 200
);
Каждый Item предоставляет методы размеров:
item.getWidth();
item.getHeight();
item.getMargin();
Пример:
grid.getItems().forEach(item => {
console.log(item.getWidth(), item.getHeight());
});
Muuri предоставляет методы состояния:
item.isVisible();
item.isActive();
item.isDragging();
item.isPositioning();
Пример:
const dragging = grid.getItems().filter(item =>
item.isDragging()
);
Если DOM изменился вне Muuri:
grid.synchronize();
Метод:
Удаление всех элементов:
grid.remove(grid.getItems());
Альтернатива:
const items = grid.getItems();
items.forEach(item => {
grid.remove(item);
});
Для высокой производительности:
layout()Оптимизированный пример:
const items = grid.getItems();
items.forEach(item => {
item.getElement().classList.add('updated');
});
grid.refreshItems();
grid.layout();
Вместо повторного перерасчета после каждого изменения.
Коллекции элементов в Muuri выполняют несколько функций:
Благодаря централизованной коллекции элементов библиотека обеспечивает: