Isotope — это мощная библиотека для динамической организации элементов сетки, обеспечивающая фильтрацию, сортировку и анимацию. Фильтрация позволяет управлять видимостью элементов на основе заданных критериев. В основе фильтрации лежит CSS-классы и селекторы, которые определяют, какие элементы отображаются в контейнере, а какие скрываются.
Для работы с фильтрацией необходимо создать экземпляр Isotope с указанием контейнера и базовых настроек:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry'
});
Здесь itemSelector указывает элементы, которые будут
участвовать в фильтрации, а layoutMode задаёт способ
расположения элементов. Значение masonry обеспечивает
плотное заполнение сетки без пустых промежутков.
Фильтр задаётся в виде CSS-селектора или функции. Простейший пример фильтрации по классу:
iso.arrange({ filter: '.category-a' });
В этом случае будут показаны только элементы с классом
category-a. Для сброса фильтра используется фильтр
'*', который отображает все элементы:
iso.arrange({ filter: '*' });
Isotope поддерживает комбинированные фильтры, что позволяет создавать сложные логические условия. Для этого применяются CSS-селекторы через запятую (OR) или конкатенацию классов (AND):
// OR: элементы с классом category-a или category-b
iso.arrange({ filter: '.category-a, .category-b' });
// AND: элементы с классом category-a и featured
iso.arrange({ filter: '.category-a.featured' });
Также возможно использование функций фильтрации для более гибкой логики:
iso.arrange({
filter: function(itemElem) {
var number = itemElem.querySelector('.number').textContent;
return parseInt(number) > 10;
}
});
В этом примере фильтруются элементы, у которых значение внутри
элемента с классом number больше 10.
Фильтры можно менять динамически на основе пользовательских действий. Например, фильтрация по кнопкам:
var filtersElem = document.querySelector('.filters-button-group');
filtersElem.addEventListener('click', function(event) {
if (!event.target.matches('button')) {
return;
}
var filterValue = event.target.getAttribute('data-filter');
iso.arrange({ filter: filterValue });
});
Каждая кнопка содержит атрибут data-filter,
соответствующий селектору, например .category-a. При
нажатии Isotope перестраивает сетку с учётом нового фильтра.
Для удобного управления интерфейсом важно отслеживать активное состояние фильтра. Обычно это делается через добавление CSS-класса к кнопке:
var buttonGroups = document.querySelectorAll('.button-group');
buttonGroups.forEach(function(group) {
group.addEventListener('click', function(event) {
if (!event.target.matches('button')) return;
group.querySelectorAll('.is-checked').forEach(function(btn) {
btn.classList.remove('is-checked');
});
event.target.classList.add('is-checked');
});
});
Таким образом, можно визуально выделять текущий фильтр, обеспечивая пользователю обратную связь.
Isotope поддерживает плавные анимации при смене фильтров. Для этого
достаточно задать параметры transitionDuration и
hiddenStyle/visibleStyle:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
transitionDuration: '0.6s',
hiddenStyle: { opacity: 0, transform: 'scale(0.8)' },
visibleStyle: { opacity: 1, transform: 'scale(1)' }
});
Элементы плавно исчезают и появляются, сохраняя динамическую структуру сетки.
Для сложных интерфейсов можно комбинировать несколько фильтров через объект состояния:
var filters = {
category: '*',
tag: '*'
};
function applyFilters() {
var filterValue = filters.category + filters.tag;
iso.arrange({ filter: filterValue });
}
// Изменение категории
filters.category = '.category-b';
applyFilters();
// Изменение тега
filters.tag = '.featured';
applyFilters();
Такой подход позволяет создавать интерфейсы с множественной фильтрацией, где состояние каждого критерия хранится отдельно и комбинируется для отображения подходящих элементов.
Isotope автоматически не учитывает новые элементы, добавленные после
инициализации. Для корректной работы необходимо использовать метод
appended:
var newItems = document.querySelectorAll('.grid-item-new');
iso.appended(newItems);
iso.arrange({ filter: '*' });
Это обеспечивает включение новых элементов в существующую сетку с сохранением фильтров и анимации.
Фильтрация в Isotope — это сочетание селекторов, функций и динамического состояния, что позволяет создавать интерфейсы с высокой интерактивностью и гибкой организацией контента. Комбинируя фильтры, отслеживая активные состояния и используя анимацию, можно построить адаптивные и удобные для пользователя сетки.