Isotope — это мощная библиотека для организации и фильтрации элементов сетки в браузере. После динамической загрузки контента возникает необходимость перерасчета расположения элементов, чтобы сетка оставалась корректной и визуально выровненной. Для начала необходимо инициализировать контейнер с элементами и задать основные параметры:
var grid = document.querySelector('.grid');
var iso = new Isotope(grid, {
itemSelector: '.grid-item',
layoutMode: 'masonry',
percentPosition: true,
masonry: {
columnWidth: '.grid-sizer'
}
});
Здесь itemSelector указывает на элементы, которые
будут участвовать в сетке, layoutMode задает режим
расположения (например, masonry для кирпичной кладки), а
percentPosition позволяет использовать проценты для
ширины колонок.
При добавлении новых элементов через AJAX или другие методы необходимо не только вставить элементы в DOM, но и уведомить Isotope о появлении новых элементов. Основные методы для этого:
append — добавление новых элементов и перерасчет
сетки.reloadItems — обновление списка элементов внутри
контейнера.layout — непосредственный перерасчет положения всех
элементов.Пример добавления элементов после загрузки через AJAX:
fetch('/api/items')
.then(response => response.json())
.then(data => {
var itemsHTML = data.map(item => {
var div = document.createElement('div');
div.className = 'grid-item';
div.innerHTML = `
`;
return div;
});
itemsHTML.forEach(el => grid.appendChild(el));
iso.appended(itemsHTML); // уведомление Isotope о новых элементах
iso.layout(); // перерасчет сетки
});
Важно: метод appended автоматически
вызывает перерасчет для добавленных элементов, но иногда полезно вызвать
layout, чтобы убедиться, что сетка полностью
обновилась.
Одной из частых проблем является загрузка изображений, которые изменяют размеры элементов после первичного рендеринга. Если элементы содержат изображения с неизвестной высотой до полной загрузки, сетка будет отображаться некорректно.
Решение — использовать событие imagesLoaded:
imagesLoaded(grid, function() {
iso.layout();
});
Этот подход гарантирует, что Isotope выполняет перерасчет только после полной загрузки всех изображений, предотвращая наложение и пробелы в сетке.
Isotope позволяет фильтровать и сортировать элементы
даже после динамического добавления. Применение фильтров после загрузки
новых данных выполняется через метод arrange:
iso.arrange({
filter: '.active',
sortBy: 'name'
});
filter принимает CSS-селектор или функцию для
фильтрации элементов.sortBy позволяет отсортировать элементы по указанному
ключу, который задается через data- атрибут или объект с
пользовательскими свойствами.Применение фильтра и сортировки сразу после загрузки новых элементов обеспечивает постоянное соответствие сетки текущим условиям интерфейса.
При работе с большим количеством элементов важно
минимизировать количество перерасчетов, так как каждый
вызов layout влияет на производительность.
Рекомендации:
appended эффективнее,
чем многократные вызовы для каждого элемента.requestAnimationFrame для
анимаций и перерасчетов, чтобы избежать блокировки основного
потока.Если размеры или содержимое существующих элементов изменяются после загрузки (например, раскрытие текста, смена изображения), необходимо вызвать:
iso.layout();
Это гарантирует, что Isotope пересчитает позиции всех
элементов, сохранив правильное расположение и выравнивание. Для
больших сеток можно оптимизировать, применяя stamp к
элементам, которые не должны участвовать в перерасчете,
чтобы исключить их из лишних вычислений:
iso.stamp(document.querySelector('.fixed-element'));
iso.layout();
Isotope предоставляет несколько событий для отслеживания перерасчета и динамических изменений:
arrangeComplete — вызывается после завершения
перерасчета сетки.layoutComplete — срабатывает после любого изменения
расположения элементов.Пример использования:
iso.on('layoutComplete', function(filteredItems) {
console.log('Сетка обновлена, элементов:', filteredItems.length);
});
Это особенно полезно для обновления интерфейса, подсчета элементов или выполнения других действий после динамической загрузки.