Isotope — это мощная библиотека на JavaScript для динамического управления сетками элементов на веб-странице. Она позволяет создавать адаптивные макеты с фильтрацией, сортировкой и анимацией, обеспечивая плавный пользовательский опыт при работе с коллекциями контента, таких как галереи изображений, каталоги товаров или карточки статей. Библиотека опирается на принципы CSS Grid и Flexbox, но добавляет собственные алгоритмы позиционирования элементов с учетом доступного пространства и заданных правил.
Чтобы использовать Isotope, необходимо создать контейнер, внутри которого располагаются элементы, инициализируемые библиотекой. Основной синтаксис инициализации:
const grid = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
percentPosition: true,
masonry: {
columnWidth: '.grid-sizer'
}
});
Ключевые параметры:
itemSelector — CSS-селектор элементов, которые будут
управляться Isotope.layoutMode — режим компоновки (masonry,
fitRows, vertical, packery).percentPosition — позволяет использовать процентные
значения ширины для корректного позиционирования.masonry.columnWidth — определяет ширину колонок для
режима masonry; может быть фиксированным элементом-сизером.Isotope поддерживает несколько режимов компоновки элементов:
Isotope позволяет динамически скрывать и отображать элементы на основе CSS-селекторов или пользовательских функций.
// Фильтрация по классу
grid.arrange({ filter: '.category-web' });
// Фильтрация с функцией
grid.arrange({
filter: function(itemElem) {
return itemElem.dataset.rating > 4;
}
});
filter принимает строку селектора или функцию,
возвращающую true для элементов, которые должны
отображаться.Isotope поддерживает сортировку по атрибутам или пользовательским критериям:
grid.arrange({
sortBy: 'name',
sortAscending: true
});
sortBy может быть именем ключа, указанного в
data-* атрибуте элемента, или функцией, возвращающей
значение для сравнения.sortAscending — направление сортировки;
true — по возрастанию, false — по
убыванию.Пример сортировки по кастомной функции:
grid.arrange({
sortBy: function(itemElem) {
return parseInt(itemElem.dataset.price, 10);
},
sortAscending: false
});
Isotope поддерживает добавление и удаление элементов после инициализации:
// Добавление новых элементов
const newItems = document.querySelectorAll('.new-item');
grid.appended(newItems);
// Удаление элементов
const removeItems = document.querySelectorAll('.grid-item.remove');
grid.remove(removeItems);
appended и remove автоматически
пересчитывают расположение сетки.layout(), который пересчитывает позиции всех
элементов.Isotope использует CSS-транзишены для плавного перемещения элементов. В стандартной конфигурации перемещения элементов сопровождаются плавным изменением координат, масштаба и прозрачности. Можно управлять временем и кривой анимации через CSS:
.grid-item {
transition: transform 0.6s ease, opacity 0.6s ease;
}
transition-duration,
transition-timing-function позволяют полностью настроить
визуальные эффекты.isotope-hidden для
скрытых элементов, обеспечивая корректное отображение с анимацией.Isotope предоставляет несколько событий, которые можно использовать для расширенной логики:
arrangeComplete — вызывается после завершения
фильтрации или сортировки.layoutComplete — вызывается после завершения
перерасчета сетки.removeComplete — вызывается после удаления
элементов.Пример подписки на событие:
grid.on('arrangeComplete', function(filteredItems) {
console.log('Фильтрация завершена', filteredItems);
});
Isotope хорошо сочетается с динамическими фреймворками, такими как
React, Vue или Vanilla JS, благодаря методам добавления
и перераспределения элементов. При работе с асинхронными данными
рекомендуется инициализировать Isotope после полной загрузки элементов и
вызывать layout() после добавления новых данных.
Этот набор функций делает Isotope идеальным инструментом для создания интерактивных и адаптивных сеток, позволяя управлять расположением, видимостью и порядком элементов без сложных расчетов вручную. Понимание этих основ обеспечивает гибкую работу с библиотекой и открывает возможности для создания сложных и визуально привлекательных интерфейсов.