Muuri — это мощная библиотека для создания интерактивных сеток с поддержкой drag-and-drop, сортировки, фильтрации и анимации. Одной из ключевых возможностей является анимация при фильтрации элементов сетки. Она позволяет плавно скрывать и отображать элементы, создавая динамичный интерфейс без резких изменений.
Фильтрация в Muuri работает через метод filter(),
который принимает функцию или ключ фильтрации. При изменении фильтрации
элементы не просто исчезают или появляются мгновенно — Muuri использует
встроенную анимацию для перемещения элементов в новые позиции и плавного
скрытия/отображения элементов.
const grid = new Muuri('.grid', {
layoutDuration: 400,
layoutEasing: 'ease',
dragEnabled: true
});
// Применение фильтрации по категории
grid.filter(item => item.getElement().dataset.category === 'js');
Ключевые параметры анимации при фильтрации:
layoutDuration — время анимации в
миллисекундах для перестановки элементов.layoutEasing — функция сглаживания
анимации (например, 'ease', 'ease-in-out',
'linear').showDuration /
hideDuration — длительность анимации появления и
скрытия элементов.showEasing / hideEasing —
функции сглаживания для появления и скрытия.const grid = new Muuri('.grid', {
layoutDuration: 500,
layoutEasing: 'ease-in-out',
showDuration: 300,
showEasing: 'ease',
hideDuration: 300,
hideEasing: 'ease'
});
Методы show() и hide() позволяют управлять
отдельными элементами сетки. Эти методы автоматически запускают анимацию
появления или скрытия.
const items = grid.getItems();
// Скрыть элементы с определённой категорией
items.forEach(item => {
if(item.getElement().dataset.category !== 'js') {
item.hide();
}
});
// Показать элементы определённой категории
items.forEach(item => {
if(item.getElement().dataset.category === 'js') {
item.show();
}
});
Использование этих методов позволяет создавать кастомные фильтры с плавной анимацией, управляя отдельными элементами без изменения всей сетки.
Muuri сохраняет позиции элементов в сетке и плавно анимирует их перемещение при фильтрации. Это достигается благодаря встроенному layout engine, который пересчитывает позиции оставшихся элементов и выполняет плавное смещение.
grid.filter(item => item.getElement().dataset.category === 'css');
// Сетка автоматически перестраивается с анимацией
Важно учитывать, что если элементы динамически добавляются или
удаляются после фильтрации, необходимо вызывать
grid.refreshItems().layout() для корректного расчёта новых
позиций и плавной анимации.
Muuri поддерживает одновременное применение фильтров и сортировки. Это позволяет сначала отфильтровать элементы, а затем отсортировать оставшиеся по заданному критерию, например, по дате или алфавиту.
grid.filter(item => item.getElement().dataset.category === 'js')
.sort((a, b) => {
const aValue = a.getElement().dataset.order;
const bValue = b.getElement().dataset.order;
return aValue - bValue;
});
Анимация выполняется одновременно для скрытия/показа элементов и их перестановки, создавая впечатление единого динамичного интерфейса.
Каждый элемент можно анимировать индивидуально, используя параметры
анимации при создании элемента или через события. Muuri поддерживает
события showStart, showEnd,
hideStart и hideEnd, позволяя запускать
кастомные эффекты или синхронизировать анимацию с другими
действиями.
grid.on('showStart', (item) => {
item.getElement().style.transform = 'scale(0.8)';
});
grid.on('showEnd', (item) => {
item.getElement().style.transform = 'scale(1)';
});
Такой подход позволяет создавать уникальные эффекты появления и скрытия элементов, например, fade-in, slide, zoom или комбинации.
Для больших сеток важно учитывать производительность:
transform, opacity).grid.refreshItems() только один раз после всех
изменений.// Эффективное обновление после массовой фильтрации
grid.refreshItems().layout();
filter() или индивидуальные
show()/hide().refreshItems() при динамических
изменениях.Эта система позволяет создавать визуально динамичные, отзывчивые интерфейсы, где фильтрация элементов сопровождается плавной перестановкой и анимацией, повышая удобство и визуальную привлекательность.