Библиотека Isotope обеспечивает динамическое управление сеткой элементов, позволяя создавать сложные фильтры, сортировки и анимации. После внесения изменений в DOM, таких как добавление, удаление или изменение размеров элементов, необходимо корректно обновить макет, чтобы элементы отображались правильно и анимации сохраняли плавность.
Основной метод для обновления макета — это layout().
Этот метод пересчитывает позиции всех элементов внутри контейнера и
перестраивает сетку в соответствии с текущими настройками
layoutMode.
var $grid = $('.grid').isotope({
itemSelector: '.grid-item',
layoutMode: 'masonry'
});
// Обновление макета вручную
$grid.isotope('layout');
Метод layout() не изменяет сам набор элементов, он лишь
пересчитывает их расположение. Это полезно после динамического изменения
размеров элементов через CSS или JS.
Isotope предоставляет методы appended(),
prepended() и remove(), которые автоматически
обновляют макет после изменения коллекции элементов.
Добавление элементов:
var $items = $('<div class="grid-item">Новый элемент</div>');
$grid.append($items)
.isotope('appended', $items);
appended() принимает новые элементы и добавляет их в
существующую сетку.masonry, fitRows и
т.д.).Удаление элементов:
var $itemToRemove = $('.grid-item.to-remove');
$grid.isotope('remove', $itemToRemove)
.isotope('layout');
remove() удаляет элементы из DOM и из внутреннего
состояния Isotope.layout(), чтобы
оставшиеся элементы корректно заняли освободившееся место.Если размеры элементов меняются динамически, например, при загрузке изображений или изменении текста, необходимо уведомить Isotope о новых размерах, чтобы сетка оставалась корректной.
Пример с изображениями:
$grid.imagesLoaded().progress(function() {
$grid.isotope('layout');
});
imagesLoaded для отслеживания
полной загрузки изображений.layout(),
что предотвращает наложение элементов и разрыв сетки.Изменение размеров через JS:
$('.grid-item').each(function() {
$(this).css('height', Math.random() * 200 + 100);
});
$grid.isotope('layout');
layout() гарантирует, что сетка отобразится без
перекрытий и с правильными отступами.Методы фильтрации и сортировки автоматически вызывают обновление макета:
// Фильтрация по классу
$grid.isotope({ filter: '.active' });
// Сортировка по атрибуту
$grid.isotope({ sortBy: 'name' });
layout() для полной
синхронизации.Частое вызовы layout() могут быть ресурсоемкими на
больших сетках. Оптимизация достигается следующими подходами:
Группировка изменений: Если добавляется
несколько элементов одновременно, объединять их в один вызов
appended() вместо многократного вызова
layout().
Использование таймаута: Для динамических изменений с анимациями можно задерживать пересчет:
var timeout;
function updateLayout() {
clearTimeout(timeout);
timeout = setTimeout(function() {
$grid.isotope('layout');
}, 100);
}
updateSortData() и затем
layout().Если содержимое элементов изменяется, что влияет на сортировку, необходимо обновить данные сортировки:
$grid.isotope('updateSortData', $items);
$grid.isotope('layout');
updateSortData() позволяет пересчитать значения для
сортировки, например, атрибуты data-name или текст внутри
элементов.layout(),
чтобы сетка отобразила элементы в правильном порядке.На практике часто требуется комбинировать добавление, удаление, фильтрацию и пересчет размеров. Алгоритм действий следующий:
appended(),
remove()).updateSortData()).layout()).layout() после полной загрузки
(imagesLoaded()).Это обеспечивает корректное и плавное отображение сетки в любых сценариях.