Для работы с ленивой загрузкой элементов необходимо корректно подключить библиотеку Isotope. В базовой конфигурации это выглядит следующим образом:
<script src="https://unpkg.com/isotope-layout@3/dist/isotope.pkgd.min.js"></script>
После подключения создаётся экземпляр Isotope для контейнера элементов:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
percentPosition: true,
masonry: {
columnWidth: '.grid-sizer'
}
});
itemSelector — класс элементов сетки.layoutMode — способ отображения: masonry,
fitRows, vertical и другие.percentPosition — позволяет использовать процентную
ширину колонок.masonry.columnWidth — задаёт ширину колонки,
опционально можно использовать элемент-сизер
.grid-sizer.Ленивая загрузка изображений позволяет подгружать контент по мере необходимости, что критично для больших сеток. Для корректного взаимодействия с Isotope важно обновлять раскладку после загрузки каждого изображения.
load для обновления сеткиvar images = document.querySelectorAll('.grid img');
images.forEach(function(img) {
if (img.complete) {
iso.layout(); // Если изображение уже загружено
} else {
img.addEventListener('load', function() {
iso.layout(); // Обновление после загрузки
});
}
});
Ключевой момент: Isotope рассчитывает размеры
элементов на момент инициализации. Без обновления
(layout()) сетка может смещаться при появлении новых
изображений.
Для крупных проектов часто используют специализированные библиотеки для ленивой загрузки, такие как lazysizes. Интеграция с Isotope выглядит так:
document.addEventListener('lazyloaded', function(e){
iso.layout(); // Пересчёт сетки после подгрузки изображения
});
lazyloaded — событие, которое генерируется библиотекой
lazysizes при полной загрузке изображения.При добавлении новых элементов в DOM после инициализации Isotope необходимо их зарегистрировать и пересчитать раскладку:
var newItems = document.querySelectorAll('.grid .grid-item.new');
iso.appended(newItems); // Добавление элементов в Isotope
newItems.forEach(function(img){
img.addEventListener('load', function() {
iso.layout(); // Обновление сетки после загрузки
});
});
Важно: метод appended уведомляет
Isotope о появлении новых элементов. Без него сетка не будет корректно
отображать новые элементы.
layout() после каждой загрузки изображения, можно
использовать debounce или
requestAnimationFrame для пакетного обновления сетки.var layoutPending = false;
function scheduleLayout() {
if (!layoutPending) {
layoutPending = true;
requestAnimationFrame(function() {
iso.layout();
layoutPending = false;
});
}
}
appended(), а затем один раз вызвать
layout().columnWidth фиксированного размера, чтобы уменьшить
нагрузку на пересчёт.Для более сложных случаев ленивой загрузки можно интегрировать Intersection Observer для отслеживания элементов, попадающих в видимую область:
var observer = new IntersectionObserver(function(entries) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
var img = entry.target;
img.src = img.dataset.src; // подгрузка изображения
observer.unobserve(img);
}
});
}, { rootMargin: '200px' });
document.querySelectorAll('.grid img[data-src]').forEach(function(img) {
observer.observe(img);
});
После загрузки изображений не забывать вызывать
iso.layout() для корректного позиционирования.
appended().layout().В сочетании с современными инструментами ленивой загрузки и наблюдения за видимостью элементов Isotope позволяет строить адаптивные и быстрые сетки изображений и контента.