Isotope — это мощная библиотека для организации сетки элементов с возможностью фильтрации, сортировки и анимации. При работе с динамическим контентом важно правильно инициализировать библиотеку после того, как элементы появились в DOM. Обычно используется следующий подход:
// Инициализация Isotope
const grid = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
transitionDuration: '0.4s'
});
Если элементы загружаются динамически (например, через AJAX), необходимо сообщить Isotope о новых элементах, чтобы они корректно встроились в сетку:
// Добавление новых элементов
const newItems = document.querySelectorAll('.grid-item-new');
grid.appended(newItems);
grid.layout();
Для фильтрации элементов важно обновлять Isotope после появления новых карточек. Фильтры задаются через CSS-селекторы или функции:
// Фильтр по классу
grid.arrange({ filter: '.category-1' });
// Фильтр через функцию
grid.arrange({
filter: function(itemElem) {
const category = itemElem.getAttribute('data-category');
return category === 'category-2';
}
});
При динамическом добавлении элементов функция фильтра автоматически применяется к новым элементам.
Isotope позволяет сортировать элементы на основе атрибутов или содержимого. Для динамического контента нужно убедиться, что новые элементы имеют нужные атрибуты:
// Инициализация с параметрами сортировки
const grid = new Isotope('.grid', {
itemSelector: '.grid-item',
getSortData: {
name: '[data-name]',
date: '[data-date] parseInt'
}
});
// Сортировка по имени
grid.arrange({ sortBy: 'name', sortAscending: true });
После добавления новых элементов можно вызвать:
grid.appended(newItems);
grid.arrange({ sortBy: 'date' });
Isotope поддерживает плавные анимации при изменении сетки. Для динамических элементов необходимо учитывать transitionDuration:
const grid = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'fitRows',
transitionDuration: '0.5s'
});
// Добавление с анимацией
grid.appended(newItems);
Для удаления элементов:
grid.remove(oldItems);
grid.layout();
Удаленные элементы плавно исчезнут благодаря настроенной длительности перехода.
При работе с динамическим контентом часто встречаются изображения с неизвестными размерами. Для корректного расчета сетки применяется imagesLoaded:
imagesLoaded( '.grid', function() {
grid.layout();
});
Если изображения загружаются асинхронно, можно вызвать layout после каждого добавления, чтобы сетка перестроилась правильно.
Для интерактивных фильтров кнопки могут менять состояние при добавлении новых элементов:
const filtersElem = document.querySelector('.filters-button-group');
filtersElem.addEventListener('click', function(event) {
if (!matchesSelector(event.target, 'button')) return;
const filterValue = event.target.getAttribute('data-filter');
grid.arrange({ filter: filterValue });
});
После добавления новых элементов кнопки фильтрации автоматически
применяются к новым карточкам, если сетка обновлена через
grid.appended().
Isotope предоставляет события, полезные для динамического контента:
arrangeComplete — вызывается после фильтрации или
сортировки.layoutComplete — вызывается после перестройки
сетки.removeComplete — после удаления элементов.Пример использования:
grid.on('arrangeComplete', function(filteredItems) {
console.log('Количество отображаемых элементов:', filteredItems.length);
});
Эти события помогают синхронизировать UI, например, показывать счетчик элементов после фильтрации.
При динамическом добавлении большого числа элементов рекомендуется:
layout() после каждого элемента.DocumentFragment, а
затем добавить их одним вызовом grid.appended().transitionDuration и resize
оптимально для плавной анимации.При интеграции с Vue, React или jQuery важно:
grid.layout() после рендеринга новых
элементов.ref на контейнер и
управлять сеткой через методы Isotope.$('.grid').append(newItems).isotope('appended', newItems).isotope('layout');
Это обеспечивает корректное добавление и фильтрацию динамического контента без рассинхронизации сетки.
grid.appended() и grid.layout().appended().imagesLoaded для сеток с
изображениями.