Библиотека Isotope в JavaScript предоставляет мощный механизм для динамической фильтрации и сортировки элементов на странице. Фильтрация позволяет управлять отображением элементов на основе их классов, атрибутов или других данных, сохраняя при этом анимацию переходов и адаптивность сетки.
Для работы фильтрации необходимо, чтобы контейнер и его элементы были правильно структурированы:
<div class="grid">
<div class="grid-item category-a">Элемент A1</div>
<div class="grid-item category-b">Элемент B1</div>
<div class="grid-item category-a">Элемент A2</div>
<div class="grid-item category-c">Элемент C1</div>
</div>
Каждый элемент должен иметь класс, идентифицирующий его категорию. Isotope использует эти классы для применения фильтров.
Инициализация Isotope производится через Jav * aScript:
const grid = document.querySelector('.grid');
const iso = new Isotope(grid, {
itemSelector: '.grid-item',
layoutMode: 'fitRows'
});
itemSelector указывает, какие элементы будут
обрабатываться.layoutMode определяет способ компоновки элементов
(fitRows, masonry, vertical,
packery и др.).Фильтры задаются с помощью CSS-селекторов. Для отображения только
элементов определённой категории используется метод arrange
с опцией filter:
iso.arrange({ filter: '.category-a' });
category-a будут
отображены.Можно комбинировать несколько классов через запятую или селектор:
iso.arrange({ filter: '.category-a, .category-c' });
Isotope поддерживает фильтрацию на основе атрибутов или данных, используя функции:
iso.arrange({
filter: function(itemElem) {
const value = itemElem.getAttribute('data-price');
return parseInt(value) < 100;
}
});
true означает, что элемент будет
отображён.Фильтры можно комбинировать с сортировкой для создания интерактивных интерфейсов:
iso.arrange({
filter: '.category-b',
sortBy: 'name',
sortAscending: true
});
sortBy указывает критерий сортировки
(name, price, date и др.).sortAscending определяет порядок сортировки.Фильтры и сортировка могут обновляться динамически при взаимодействии пользователя, например через кнопки:
const buttons = document.querySelectorAll('.filter-button-group button');
buttons.forEach(button => {
button.addEventListener('click', () => {
const filterValue = button.getAttribute('data-filter');
iso.arrange({ filter: filterValue });
});
});
Isotope автоматически анимирует появление и исчезновение элементов.
Настройки анимации можно изменять через опции
transitionDuration и CSS-свойства:
const iso = new Isotope(grid, {
itemSelector: '.grid-item',
layoutMode: 'fitRows',
transitionDuration: '0.6s'
});
transitionDuration задаёт длительность анимации в
секундах или миллисекундах.Isotope корректно обрабатывает элементы, добавленные после инициализации:
const newItem = document.createElement('div');
newItem.className = 'grid-item category-a';
newItem.textContent = 'Новый элемент';
grid.appendChild(newItem);
iso.appended(newItem);
iso.arrange({ filter: '.category-a' });
appended уведомляет Isotope о новом
элементе.Для более сложных интерфейсов можно комбинировать фильтры через логические функции:
iso.arrange({
filter: function(itemElem) {
const category = itemElem.classList.contains('category-a');
const price = parseInt(itemElem.getAttribute('data-price')) < 200;
return category && price;
}
});
A
с ценой ниже 200.transitionDuration в соответствии с
количеством элементов, чтобы анимация оставалась плавной.Фильтрация в Isotope — это гибкий инструмент, позволяющий создавать сложные и интерактивные интерфейсы, управлять отображением элементов динамически, сочетать разные условия и поддерживать адаптивную анимацию сетки.