Muuri — это библиотека для создания гибких, интерактивных сеток элементов с возможностью анимации, перетаскивания и фильтрации. Одним из ключевых аспектов работы с Muuri является управление фиксированными и динамическими элементами, что позволяет создавать сложные макеты с комбинированной структурой сетки.
Фиксированные элементы — это элементы, которые не участвуют в динамическом расположении и не перемещаются при перестройке сетки. Они часто используются для статических блоков: шапок, навигационных панелей или специальных карточек, которые должны оставаться на своих местах независимо от действий пользователя.
Для того чтобы сделать элемент фиксированным, используется класс
item в комбинации с опцией dragEnabled и
методом add. Пример:
const grid = new Muuri('.grid', {
dragEnabled: true
});
const fixedElement = document.querySelector('.fixed-item');
grid.add(fixedElement, { dragEnabled: false });
dragEnabled: false отключает возможность
перетаскивания.Для визуального выделения фиксированных элементов можно использовать CSS-свойства:
.fixed-item {
position: absolute;
z-index: 1000;
pointer-events: none;
}
position: absolute гарантирует, что элемент не
смещается другими элементами сетки.z-index контролирует порядок наложения.pointer-events: none делает элемент интерактивным
только через скрипт, предотвращая вмешательство мыши в сетку.Фиксированные элементы не конфликтуют с динамическими. При добавлении или удалении динамических элементов Muuri перестраивает только сетку динамических элементов, оставляя фиксированные на своих местах.
Динамические элементы — это элементы, которые участвуют во всех операциях сетки: сортировке, фильтрации, перетаскивании и анимации.
Динамический элемент добавляется стандартным способом:
const dynamicItem = document.createElement('div');
dynamicItem.classList.add('item');
grid.add(dynamicItem);
dragEnabled).Muuri предоставляет методы для работы с динамическими элементами:
grid.add(items) — добавление элементов в сетку.grid.remove(items, { removeElements: true }) — удаление
элементов.grid.filter(function(item) { return item.getElement().classList.contains('active'); })
— фильтрация.grid.sort(function(a, b) { return a.getElement().dataset.order - b.getElement().dataset.order; })
— сортировка по произвольному критерию.Динамические элементы могут менять свои размеры, и сетка автоматически это учитывает через метод:
grid.refreshItems().layout();
refreshItems() обновляет внутренние размеры
элементов.layout() перестраивает сетку с анимацией.Часто возникает задача смешать фиксированные и динамические элементы. Muuri позволяет создавать гибридные сетки, где часть элементов статична, а часть подвижна.
const grid = new Muuri('.grid', {
dragEnabled: true
});
const fixed = document.querySelectorAll('.fixed-item');
fixed.forEach(item => grid.add(item, { dragEnabled: false }));
const dynamic = document.querySelectorAll('.dynamic-item');
dynamic.forEach(item => grid.add(item));
Для больших сеток рекомендуется:
dragEnabled: false для всех фиксированных
элементов.grid.layout() только после массовых изменений,
чтобы избежать лишних перерисовок.Фиксированные и динамические элементы особенно полезны в интерфейсах типа панелей управления, дашбордов, галерей и каталогов:
const grid = new Muuri('.grid', {
dragEnabled: true,
layout: { rounding: false }
});
grid.add(document.querySelectorAll('.fixed-item'), { dragEnabled: false });
grid.add(document.querySelectorAll('.dynamic-item'));
grid.on('dragReleaseEnd', () => grid.layout());
dragReleaseEnd помогает
синхронизировать динамическую перестройку сетки после завершения
перетаскивания.Эта комбинация позволяет строить гибкие, интерактивные сетки, в которых статические блоки поддерживают структуру, а динамические элементы обеспечивают функциональность и визуальную активность.