Infinite Scroll — это техника, позволяющая динамически загружать новые элементы на страницу по мере прокрутки, без необходимости перезагрузки. В сочетании с Isotope она обеспечивает плавную, интерактивную сетку с фильтрацией и сортировкой элементов. Важным моментом является синхронизация добавления новых элементов с перерасчетом позиций в сетке.
Для работы с Infinite Scroll на основе Isotope необходимы:
.appended().var $grid = $('.grid').isotope({
itemSelector: '.grid-item',
layoutMode: 'masonry'
});
$grid.infiniteScroll({
path: '.pagination__next',
append: '.grid-item',
outlayer: $grid.data('isotope'),
status: '.page-load-status'
});
Ключевой момент: outlayer должен быть
установлен на экземпляр Isotope, чтобы новые элементы корректно
вставлялись в сетку.
path
и загрузка элементовПараметр path в Infinite Scroll отвечает за определение
URL для следующей страницы контента. Он может быть строкой с шаблоном
или функцией. Например:
$grid.infiniteScroll({
path: function() {
var nextPage = this.pageIndex + 1;
return '/page/' + nextPage + '/';
},
append: '.grid-item',
outlayer: $grid.data('isotope')
});
Использование функции path позволяет гибко управлять
нумерацией страниц и адаптировать под REST API или пагинацию на
сервере.
Infinite Scroll предоставляет набор событий, которые необходимы для корректной интеграции с Isotope:
append.infiniteScroll — срабатывает при добавлении
новых элементов;load.infiniteScroll — срабатывает при успешной загрузке
следующей страницы;error.infiniteScroll — при ошибке загрузки.Пример привязки события для добавления элементов в Isotope:
$grid.on('append.infiniteScroll', function(event, response, path, items) {
var $items = $(items);
$grid.isotope('appended', $items);
});
Здесь items — это элементы, загруженные Infinite Scroll.
Метод appended добавляет их в сетку, перерассчитывая
позиции и анимацию.
При работе с большим количеством элементов важно минимизировать перерасчет сетки:
.appended() —
вставка сразу всех загруженных элементов в одну операцию.imagesLoaded для корректного расчета
размеров изображений:$grid.imagesLoaded(function() {
$grid.isotope('layout');
});
Это предотвращает смещение элементов при асинхронной загрузке картинок.
Isotope позволяет фильтровать и сортировать элементы на лету. После добавления новых элементов через Infinite Scroll необходимо учитывать, что фильтры могут не применяться автоматически. Решение — повторно вызывать фильтр после добавления элементов:
$grid.on('append.infiniteScroll', function(event, response, path, items) {
var $items = $(items);
$grid.isotope('appended', $items);
$grid.isotope({ filter: '.active-filter' });
});
Это гарантирует, что новые элементы будут соответствовать текущему фильтру.
Infinite Scroll поддерживает индикаторы состояния загрузки:
.page-load-status — блок состояния (загрузка, конец
страниц, ошибка);status — опция для привязки к DOM элементу.Пример с кастомным статусом:
<div class="page-load-status">
<div class="infinite-scroll-request">Загрузка...</div>
<div class="infinite-scroll-last">Больше нет элементов</div>
<div class="infinite-scroll-error">Ошибка загрузки</div>
</div>
И подключение через JS:
$grid.infiniteScroll({
path: '.pagination__next',
append: '.grid-item',
outlayer: $grid.data('isotope'),
status: '.page-load-status',
history: false
});
Вместо автоматической подгрузки при скролле можно использовать кнопку для загрузки следующей страницы:
var infScroll = $grid.data('infiniteScroll');
$('.load-more-button').on('click', function() {
infScroll.loadNextPage();
});
Преимущество — контроль за количеством загруженных элементов и удобство UX на мобильных устройствах.
itemSelector Isotope совпадает с
селектором элементов, подгружаемых Infinite Scroll.console.log(items) внутри события
append.infiniteScroll для подтверждения, что элементы
загружаются корректно.outlayer и imagesLoaded.Эта последовательность действий обеспечивает стабильную работу сетки Isotope с динамической подгрузкой элементов и гарантирует корректное отображение даже при сложных фильтрах и больших объемах данных.