В библиотеке Muuri фильтрация элементов сетки
осуществляется с помощью предикатов — функций, которые
возвращают булево значение (true или false)
для каждого элемента. Предикат определяет, должен ли элемент
отображаться в текущей конфигурации сетки. Это позволяет создавать
динамические интерфейсы с возможностью скрытия или показа элементов на
основе заданных критериев.
const grid = new Muuri('.grid', {
layout: {
rounding: false
}
});
// Пример предиката: показываем только элементы с классом 'active'
grid.filter(item => item.getElement().classList.contains('active'));
В этом примере filter принимает функцию, которая
вызывается для каждого элемента. Если функция возвращает
true, элемент остаётся видимым; если false —
элемент скрывается с анимацией.
Предикаты могут быть комплексными, объединяя несколько условий. Например, можно фильтровать элементы по классу и по атрибуту:
grid.filter(item => {
const el = item.getElement();
const isActive = el.classList.contains('active');
const type = el.getAttribute('data-type');
return isActive && type === 'featured';
});
Здесь фильтрация осуществляется только для элементов, которые
одновременно имеют класс active и атрибут
data-type="featured".
Muuri поддерживает динамическое изменение фильтров. Предикат можно обновлять в любой момент времени, что позволяет реализовать интерактивные интерфейсы:
let currentFilter = 'all';
function updateFilter(type) {
currentFilter = type;
grid.filter(item => {
if (currentFilter === 'all') return true;
return item.getElement().dataset.category === currentFilter;
});
}
document.querySelectorAll('.filter-button').forEach(button => {
button.addEventListener('click', () => {
updateFilter(button.dataset.filter);
});
});
Этот пример демонстрирует, как фильтровать элементы по категориям с помощью кнопок, меняя предикат в реальном времени.
Можно объединять несколько предикатов через логические операторы, создавая сложные правила фильтрации. Например:
const isActive = item => item.getElement().classList.contains('active');
const isFeatured = item => item.getElement().dataset.type === 'featured';
grid.filter(item => isActive(item) && isFeatured(item));
Такой подход улучшает читаемость и повторное использование кода.
Когда элемент скрывается с помощью предиката, Muuri автоматически
применяет плавную анимацию. Можно управлять анимацией
через опции layout и
show/hide:
grid.filter(item => item.getElement().classList.contains('active'), {
layout: {
duration: 400,
easing: 'ease-in-out'
},
hide: {
duration: 300,
easing: 'ease-out'
},
show: {
duration: 300,
easing: 'ease-in'
}
});
Это позволяет настраивать скорость и стиль появления и исчезновения элементов, делая интерфейс более отзывчивым.
Предикаты можно строить на основе любых данных, хранящихся в dataset, объекте элемента или внешних состояниях:
grid.filter(item => {
const rating = parseInt(item.getElement().dataset.rating, 10);
return rating >= 4;
});
Таким образом можно реализовать фильтры, основанные на рейтинге, цене, дате или других метаданных.
Чтобы вернуть все элементы сетки в отображение, предикат можно
установить как всегда возвращающий true:
grid.filter(() => true);
Это эффективный способ очистки текущей фильтрации без необходимости обновлять каждую категорию вручную.