Muuri — это высокоэффективная библиотека для организации сеток с динамическими элементами в браузере на JavaScript. Она позволяет создавать сетки с перетаскиваемыми элементами, анимациями, фильтрацией и сортировкой без сложной логики с нуля. Для портфолио с фильтрацией она идеально подходит, так как позволяет управлять видимостью и положением карточек проектов в режиме реального времени.
Сначала необходимо подключить библиотеку и создать контейнер для элементов портфолио:
<div class="grid">
<div class="item" data-category="web">Проект 1</div>
<div class="item" data-category="mobile">Проект 2</div>
<div class="item" data-category="design">Проект 3</div>
<div class="item" data-category="web">Проект 4</div>
</div>
В JavaScript сетка создаётся так:
const grid = new Muuri('.grid', {
items: '.item',
layout: {
rounding: false
},
dragEnabled: false
});
items — CSS-селектор для элементов сетки.layout.rounding — отключает округление координат, что
делает анимацию более плавной.dragEnabled — отключает возможность перетаскивания,
если она не нужна.Фильтрация позволяет показывать только те элементы, которые
соответствуют выбранной категории. Для этого используется метод
filter:
function filterGrid(category) {
grid.filter(item => {
if (category === 'all') return true;
return item.getElement().dataset.category === category;
});
}
item.getElement() возвращает DOM-элемент, связанный с
объектом Muuri.dataset.category извлекает значение категории, заданное
в HTML.'all' используется для сброса фильтрации и отображения
всех элементов.Фильтрация может быть связана с кнопками:
const buttons = document.querySelectorAll('.filter-button');
buttons.forEach(button => {
button.addEventListener('click', () => {
const category = button.dataset.filter;
filterGrid(category);
});
});
Muuri автоматически анимирует перестановку элементов при фильтрации. Для управления анимацией можно задать параметры при инициализации:
const grid = new Muuri('.grid', {
layout: {
duration: 400,
easing: 'ease'
}
});
duration — длительность анимации в миллисекундах.easing — функция сглаживания анимации.Эти параметры делают фильтрацию визуально привлекательной и плавной.
Сортировка элементов по различным критериям также легко интегрируется. Например, по алфавиту:
grid.sort((a, b) => {
const textA = a.getElement().textContent.toLowerCase();
const textB = b.getElement().textContent.toLowerCase();
return textA.localeCompare(textB);
});
Muuri поддерживает разные стратегии сортировки, включая числовую, текстовую или пользовательскую.
Можно создавать интерфейс, где сначала фильтруются элементы, а затем они сортируются:
filterGrid('web'); // показываем только веб-проекты
grid.sort((a, b) => a.getElement().textContent.length - b.getElement().textContent.length);
Muuri корректно обновляет позиционирование элементов при изменении фильтра или сортировки.
Если новые элементы добавляются после инициализации сетки, их необходимо добавить в объект Muuri и пересчитать расположение:
const newItem = document.createElement('div');
newItem.classList.add('item');
newItem.dataset.category = 'design';
newItem.textContent = 'Проект 5';
document.querySelector('.grid').appendChild(newItem);
grid.add(newItem);
grid.layout();
Метод add добавляет элементы, а layout
пересчитывает их расположение.
Для более сложной фильтрации можно скрывать элементы с анимацией, не удаляя их из DOM:
grid.filter(item => {
const category = item.getElement().dataset.category;
return category === 'mobile';
}, { layout: { duration: 300 } });
Это позволяет легко переключаться между категориями без потери состояния элементов.
Muuri автоматически поддерживает изменение размеров контейнера. При изменении ширины окна элементы плавно перестраиваются. Для оптимизации работы на мобильных устройствах рекомендуется:
window.addEventListener('resize', () => grid.refreshItems().layout());
refreshItems() обновляет размеры элементов.layout() перерассчитывает расположение.Каждый элемент сетки можно стилизовать с помощью CSS, включая тени, отступы, анимации при наведении:
.grid {
display: flex;
flex-wrap: wrap;
}
.item {
width: 200px;
height: 150px;
margin: 10px;
background-color: #f0f0f0;
display: flex;
align-items: center;
justify-content: center;
transition: transform 0.4s ease;
}
Эти стили позволяют сетке выглядеть современно и аккуратно при фильтрации.
.grid с элементами
.item, каждая карточка с data-category.Эта структура обеспечивает гибкий и динамичный интерфейс портфолио с фильтрацией и плавной анимацией.