Muuri — это мощная библиотека для организации сеточных (grid) элементов в веб-приложениях на JavaScript. Она обеспечивает гибкую сортировку, фильтрацию, перетаскивание элементов (drag & drop), а также плавные анимации изменения положения и размеров элементов. В контексте галерей изображений Muuri позволяет создавать динамические, отзывчивые и интерактивные сетки, которые автоматически адаптируются под размер контейнера и содержимого.
Grid в Muuri строится на основе контейнера и набора элементов, которые в него помещены. Каждый элемент может содержать любое DOM-содержимое — изображение, текст, кнопки и комбинации этих элементов.
const grid = new Muuri('.grid', {
layout: {
rounding: false
},
dragEnabled: true
});
В данном примере .grid — это CSS-класс контейнера, а
layout.rounding: false обеспечивает точное позиционирование
элементов без округления координат, что особенно важно при работе с
изображениями различного размера.
Для корректной работы Muuri структура DOM должна быть упорядочена следующим образом:
<div class="grid">
<div class="item">
<div class="item-content">
<img src="image1.jpg" alt="Описание изображения">
</div>
</div>
<div class="item">
<div class="item-content">
<img src="image2.jpg" alt="Описание изображения">
</div>
</div>
<!-- Дополнительные элементы -->
</div>
Muuri предоставляет множество опций, позволяющих гибко управлять поведением галереи:
layout — настройка расположения элементов.
fillGaps — заполняет пустые места при перемещении
элементов.horizontal — переключение между горизонтальной и
вертикальной ориентацией сетки.dragEnabled — разрешение на перетаскивание элементов.
dragSort — возможность сортировки при перетаскивании.
dragSortInterval — частота проверки пересечения элементов при перетаскивании.
dragContainer — контейнер, куда перемещается элемент во время drag & drop.
const grid = new Muuri('.grid', {
dragEnabled: true,
layout: {
fillGaps: true
},
dragSort: true,
dragSortInterval: 100
});
Фильтрация позволяет скрывать элементы, не удовлетворяющие определённым критериям, без разрушения сетки. Например, скрытие изображений по тегу:
function filterCategory(category) {
grid.filter(item => item.getElement().dataset.category === category);
}
Сортировка элементов выполняется с использованием
функции sortBy, где можно сортировать по любому
свойству:
grid.sort((a, b) => {
const dateA = a.getElement().dataset.date;
const dateB = b.getElement().dataset.date;
return dateA - dateB;
});
Muuri автоматически плавно анимирует перемещение элементов после фильтрации или сортировки, создавая эффект живой динамической сетки.
Muuri предоставляет встроенную систему анимации, которая управляет:
Примеры ключевых событий:
layoutStart и layoutEnd — запуск и
завершение перестройки сетки.dragStart, dragMove, dragEnd
— события при перетаскивании.filter — вызов при изменении фильтрации.grid.on('dragEnd', (item) => {
console.log('Элемент перемещён:', item.getElement());
});
Muuri автоматически рассчитывает размеры элементов на основе их содержимого. Чтобы сетка выглядела аккуратно:
.item-content,
чтобы применять padding и border без нарушения сетки..item-content img {
display: block;
max-width: 100%;
height: auto;
}
grid.refreshItems().layout() после
динамического добавления изображений для корректного обновления
сетки.const newItem = document.createElement('div');
newItem.className = 'item';
newItem.innerHTML = `<div class="item-content"><img src="new.jpg"></div>`;
grid.add(newItem);
grid.refreshItems().layout();
Muuri хорошо интегрируется с ленивой загрузкой изображений. После загрузки нового изображения рекомендуется обновлять сетку:
const img = new Image();
img.src = 'image-lazy.jpg';
img.onl oad = () => {
grid.refreshItems().layout();
};
Для адаптивных сеток можно использовать медиазапросы или событие
window.resize:
window.addEventListener('resize', () => {
grid.refreshItems().layout();
});
Muuri позволяет применять CSS-анимации и transition при движении элементов. Например, эффект масштабирования при наведении:
.item-content {
transition: transform 0.3s ease;
}
.item-content:hover {
transform: scale(1.05);
}
Muuri при этом будет корректно учитывать новые размеры при layout и drag & drop.
Элементы можно динамически добавлять, удалять и перемещать внутри сетки:
add(items, options) — добавление новых элементов.remove(items, options) — удаление элементов с
анимацией.move(item, index, options) — перемещение элемента на
другую позицию.grid.remove([item], { removeElements: true });
grid.add([newItem], { index: 0 });
Использование этих методов позволяет создавать интерактивные галереи с изменяемым контентом без перезагрузки страницы.
Библиотека Muuri предоставляет полный набор инструментов для реализации динамических, интерактивных и отзывчивых галерей изображений. С помощью гибких настроек layout, drag & drop, фильтрации, сортировки и анимации можно создавать сетки любой сложности, обеспечивая плавный пользовательский опыт и высокую визуальную привлекательность.