Множественные фильтры позволяют комбинировать несколько критериев отображения элементов сетки одновременно. В Isotope это реализуется через объединение классов или атрибутов элементов, что позволяет создавать динамические и интерактивные интерфейсы с гибкой сортировкой и фильтрацией.
Для работы с множественными фильтрами важно понимать, как Isotope обрабатывает селекторы. Каждый фильтр передается как CSS-селектор, а при комбинировании нескольких фильтров используется логика «И» или «ИЛИ» в зависимости от реализации.
Инициализация Isotope с фильтрацией осуществляется через объект конфигурации:
const iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'fitRows',
getSortData: {
category: '[data-category]',
size: '[data-size]'
}
});
Ключевые моменты:
itemSelector – CSS-селектор элементов сетки.layoutMode – режим расположения элементов
(fitRows, masonry и т.д.).getSortData – позволяет задать сортировку по
произвольным атрибутам.Для комбинирования фильтров обычно используют несколько групп кнопок или чекбоксов. Каждая группа представляет отдельный критерий фильтрации.
Пример структуры HTML:
<div class="filters">
<div class="filter-group" data-filter-group="category">
<button data-filter=".fruit">Фрукты</button>
<button data-filter=".vegetable">Овощи</button>
</div>
<div class="filter-group" data-filter-group="color">
<button data-filter=".red">Красный</button>
<button data-filter=".green">Зеленый</button>
</div>
</div>
<div class="grid">
<div class="grid-item fruit red"></div>
<div class="grid-item vegetable green"></div>
<div class="grid-item fruit green"></div>
</div>
Каждая кнопка содержит атрибут data-filter, который
указывает на класс элемента, по которому производится фильтрация.
Атрибут data-filter-group помогает организовать группы
фильтров.
Для объединения фильтров в один селектор можно использовать объект для хранения активных фильтров:
let filters = {};
const filterGroups = document.querySelectorAll('.filter-group');
filterGroups.forEach(group => {
group.addEventListener('click', event => {
if (!event.target.matches('button')) return;
const filterGroup = group.getAttribute('data-filter-group');
filters[filterGroup] = event.target.getAttribute('data-filter');
const filterValue = Object.values(filters).join('');
iso.arrange({ filter: filterValue });
});
});
Объяснение работы:
filters, в котором ключи соответствуют
группам фильтров.iso.arrange({ filter: filterValue }) обновляет
отображение элементов, комбинируя все активные фильтры.Если необходимо поддерживать несколько выборов внутри одной группы, структура кода немного усложняется:
let filters = {};
document.querySelectorAll('.filter-group').forEach(group => {
const groupName = group.getAttribute('data-filter-group');
filters[groupName] = [];
group.addEventListener('change', event => {
const checkboxes = group.querySelectorAll('input[type="checkbox"]');
filters[groupName] = Array.from(checkboxes)
.filter(cb => cb.checked)
.map(cb => cb.getAttribute('data-filter'));
const filterValue = Object.values(filters)
.map(arr => arr.join(','))
.join('');
iso.arrange({ filter: filterValue });
});
});
Особенности:
Isotope поддерживает фильтрацию не только по классам, но и по
атрибутам. Пример фильтрации по цвету, заданному в
data-color:
iso.arrange({
filter: '[data-color="red"]'
});
Для множественных атрибутов можно комбинировать селекторы:
iso.arrange({
filter: '[data-category="fruit"][data-color="green"]'
});
Фильтры можно формировать динамически на основе данных, получаемых с
сервера или из массива объектов. Основной подход – генерировать HTML
кнопок или чекбоксов и обновлять объект filters, чтобы
Isotope корректно применял новые условия фильтрации.
Isotope поддерживает анимацию элементов при изменении фильтрации.
Можно настраивать длительность, тип easing и другие параметры через
объект transitionDuration:
iso.arrange({
filter: '.fruit',
transitionDuration: '0.6s'
});
Для плавного скрытия элементов можно использовать CSS:
.grid-item {
transition: transform 0.6s, opacity 0.6s;
}
Для реализации сложных условий, таких как «элементы, которые принадлежат к категории фрукты и красные, либо овощи и зеленые», необходимо формировать селектор вручную:
const complexFilter = '.fruit.red, .vegetable.green';
iso.arrange({ filter: complexFilter });
Это позволяет задавать гибкую логику фильтрации с комбинацией «И» и «ИЛИ» между классами и группами.
Эти принципы и подходы формируют основу работы с множественными фильтрами в Isotope, обеспечивая высокую гибкость в управлении сеткой элементов и создании интерактивных интерфейсов.