Библиотека Muuri обеспечивает гибкое управление сетками элементов с возможностью анимации, сортировки, фильтрации и перетаскивания. В стандартной работе Muuri самостоятельно вычисляет позиции элементов на основе их размеров, контейнера и сеточного порядка. Однако существуют сценарии, когда требуется полный контроль над позициями элементов, минуя автоматический расчет.
Ручной расчет позиций позволяет задавать точные координаты элементов, создавать нестандартные раскладки и реализовывать сложные анимации.
Каждый элемент сетки в Muuri представлен объектом типа
Muuri.Item. Для работы с позицией элемента используются
методы:
item.getWidth() // ширина элемента
item.getHeight() // высота элемента
item.getPosition() // текущая позиция {left, top}
item.getGrid()._element.getBoundingClientRect() // размеры контейнера
getPosition() возвращает объект с координатами
относительно контейнера. Эти данные позволяют рассчитывать новые
позиции вручную и применять их через анимацию или прямое
обновление.
Для изменения позиции элемента используется метод
item.setPosition(left, top):
const item = grid.getItems()[0];
item.setPosition(100, 50); // установит элемент в координаты (100px, 50px)
Особенности работы:
grid.refreshItems() и
grid.layout(true) для закрепления позиции.Для плавного перемещения элементов можно включить анимацию:
item.setPosition(200, 150, {
duration: 400,
easing: 'ease-in-out'
});
Параметры:
duration — время анимации в миллисекундах.easing — тип кривой анимации ('ease',
'linear', 'ease-in', 'ease-out' и
др.).Это позволяет создавать динамические эффекты, когда элементы перемещаются к новым координатам без перестройки всей сетки.
Если требуется полностью задать координаты всей сетки вручную,
применяется метод grid.getItems() в комбинации с
setPosition:
grid.getItems().forEach((item, index) => {
const x = (index % 4) * 120;
const y = Math.floor(index / 4) * 150;
item.setPosition(x, y);
});
В этом примере формируется сеточная раскладка 4×N, где шаг по X и Y определяется заранее. Такой подход позволяет создавать кастомные сетки, не полагаясь на встроенный алгоритм Muuri.
Muuri хранит позиции элементов в виде объекта item._pos,
который содержит текущие координаты. Можно использовать их для
сложных рассчетов, например, для адаптивной сетки или
эффекта “сложения” элементов:
grid.getItems().forEach(item => {
const pos = item.getPosition();
item.setPosition(pos.left + 20, pos.top + 10);
});
Такой подход позволяет сдвигать элементы относительно их текущей позиции, не разрушая исходную структуру сетки.
Для реализации пользовательских интерфейсов с динамическими сетками полезно сохранять позиции:
const positions = grid.getItems().map(item => {
const pos = item.getPosition();
return { id: item.getElement().dataset.id, left: pos.left, top: pos.top };
});
Для восстановления:
positions.forEach(p => {
const item = grid.getItems().find(i => i.getElement().dataset.id === p.id);
if(item) item.setPosition(p.left, p.top);
});
Это удобно для динамических фильтров, drag & drop с сохранением состояния или для анимаций “восстановления” сетки после перестановки.
При ручном позиционировании важно учитывать:
grid.layout(true).Пример адаптивного пересчета:
window.addEventListener('resize', () => {
grid.getItems().forEach((item, index) => {
const x = (index % 3) * (item.getWidth() + 10);
const y = Math.floor(index / 3) * (item.getHeight() + 10);
item.setPosition(x, y);
});
});
layout() и refreshItems().Ручной расчет позиций в Muuri открывает возможности для уникальных интерфейсов, нестандартных сеток и анимаций, сохраняя при этом контроль над каждым элементом сетки и обеспечивая плавное визуальное восприятие.