Muuri — это мощная библиотека для создания динамических сеток с возможностью сортировки, фильтрации и перетаскивания элементов. В контексте вертикальной раскладки ключевым моментом является управление потоками элементов по вертикали, что отличается от стандартной сетки с фиксированной шириной и горизонтальным выравниванием.
Вертикальная раскладка начинается с правильного HTML-контейнера. Контейнер должен содержать набор элементов с одинаковым или динамически меняющимся размером по ширине. Пример базовой структуры:
1
2
3
4
Каждый элемент должен иметь стили, обеспечивающие фиксированную ширину и динамическую высоту, чтобы Muuri мог корректно располагать их по вертикали:
#grid {
width: 300px; /* фиксированная ширина контейнера */
}
.item {
width: 100%; /* ширина элемента под контейнер */
margin-bottom: 10px; /* вертикальный отступ между элементами */
box-sizing: border-box;
}
Для вертикальной раскладки создается экземпляр Muuri с указанием контейнера и ключевых опций:
const grid = new Muuri('#grid', {
layout: {
fillGaps: true, // заполняет пустоты при изменении размера элементов
horizontal: false, // критично для вертикальной раскладки
alignRight: false,
alignBottom: false
},
dragEnabled: true // если требуется перетаскивание элементов
});
Muuri позволяет динамически сортировать элементы с помощью
критериев сортировки. Для вертикальной раскладки удобно
использовать свойства top и height каждого
элемента:
grid.sort((a, b) => {
return a.getHeight() - b.getHeight();
});
С помощью этого подхода более высокие элементы будут располагаться ниже, а более низкие — выше, сохраняя вертикальный поток.
Для вертикальной раскладки фильтрация работает так же, как и для стандартной сетки, но нужно учитывать, что скрытие элемента влияет на общую высоту контейнера. Пример фильтрации по классу:
grid.filter(item => item.getElement().classList.contains('active'));
Muuri автоматически перераспределяет элементы по вертикали, заполняя пустоты, оставшиеся после скрытых элементов.
Для динамической вертикальной раскладки критично отслеживать
изменения размеров элементов. Muuri предоставляет метод
refreshItems:
// обновление размеров элементов
grid.refreshItems().layout();
Это позволяет корректно перераспределять элементы, если их высота изменяется из-за контента, например, текста или изображений.
Перемещение элементов в вертикальной раскладке может быть плавным благодаря встроенной анимации Muuri. Опции можно настроить следующим образом:
grid.layout(true); // true включает анимацию
Параметры анимации можно задать глобально:
grid.on('layoutStart', () => console.log('Начало перераспределения'));
grid.on('layoutEnd', () => console.log('Конец перераспределения'));
Для вертикальной сетки важно поддерживать адаптивность контейнера.
Использование CSS-свойств width: 100% для элементов и
медиа-запросов для контейнера позволяет Muuri корректно перераспределять
элементы при изменении ширины экрана.
@media (max-width: 600px) {
#grid {
width: 100%;
}
}
Вертикальная раскладка особенно удобна для перетаскивания элементов. Muuri обеспечивает плавное перетаскивание, автоматическое перераспределение элементов и поддержку коллизий. Пример настройки drag:
grid.on('dragEnd', (item) => {
grid.layout();
});
Можно ограничивать направления перетаскивания только вертикально:
grid.getItems().forEach(item => {
item.getElement().style.cursor = 'grab';
item.on('dragMove', (event) => {
event.preventDefault(); // блокировка горизонтального движения
});
});
Вертикальная раскладка Muuri идеально подходит для ленты новостей,
карточек товаров или списков задач. Добавление нового элемента
выполняется через метод add:
const newItem = document.createElement('div');
newItem.classList.add('item');
newItem.textContent = 'Новый элемент';
grid.add(newItem);
grid.layout(true); // обновление и анимация
Muuri автоматически вставит новый элемент на соответствующую позицию с вертикальным выравниванием.