Isotope и Packery — это библиотеки для создания динамических сеток с возможностью фильтрации, сортировки и позиционирования элементов. Несмотря на схожесть, у этих библиотек различный подход к управлению позициями элементов: Packery опирается на концепцию «свободного позиционирования» элементов, в то время как Isotope использует гибкую сетку с поддержкой анимации, фильтров и сортировки.
masonry, fitRows, vertical).
Анимация и фильтрация выполняются автоматически, без ручного контроля
позиции каждого элемента.Понимание этих различий критично при миграции: логика позиционирования в Packery часто завязана на абсолютные координаты, а в Isotope важна привязка к контейнеру и layoutMode.
В Packery контейнер инициализировался через:
var pckry = new Packery('.grid', {
itemSelector: '.grid-item',
gutter: 10
});
В Isotope аналогичная инициализация выглядит так:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
masonry: {
gutter: 10
}
});
Ключевые моменты:
layoutMode выбирает способ расположения элементов
(masonry, fitRows,
vertical).masonry.gutter заменяет настройку
gutter в Packery.Packery использует комбинацию с element.style.display
или внешними библиотеками для фильтрации:
var items = pckry.getItemElements();
items.forEach(function(item) {
if (!item.classList.contains('active')) {
item.style.display = 'none';
}
});
pckry.layout();
В Isotope фильтрация встроена напрямую:
iso.arrange({ filter: '.active' });
Преимущества:
display
элементов..category1.active, :not(.disabled)).Packery не предоставляет встроенной сортировки. Для сортировки
приходилось вручную переставлять элементы в DOM и вызывать
layout().
Isotope поддерживает сортировку через getSortData и
sortBy:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
getSortData: {
name: '.name', // текст внутри элемента
date: '[data-date]' // дата из атрибута
}
});
iso.arrange({ sortBy: 'date', sortAscending: true });
Особенности миграции:
data-*).Добавление и удаление элементов в Packery требовало явного вызова методов:
pckry.appended(newElements);
pckry.layout();
В Isotope это делается через appended и
remove:
// Добавление
iso.appended(newElements);
// Удаление
iso.remove(removedElements);
iso.layout();
Замечания:
layout и arrange могут вызываться
после массовых изменений элементов для корректной анимации.Packery использовал библиотеку Draggabilly для
drag-and-drop и требовал внешних решений для анимации.
Isotope имеет встроенные возможности анимации:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
transitionDuration: '0.4s'
});
Параметры анимации:
transitionDuration — продолжительность анимации.hiddenStyle и visibleStyle позволяют
кастомизировать анимацию при фильтрации элементов.hiddenStyle: { opacity: 0, transform: 'scale(0.8)' },
visibleStyle: { opacity: 1, transform: 'scale(1)' }
fitRows или masonry с заданной
шириной колонок.masonry с
гибкой шириной элементов и percentPosition: true позволяет
приблизиться к исходной верстке.var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
masonry: { columnWidth: '.grid-sizer', percentPosition: true }
});
.grid-sizer).Draggable из библиотеки GSAP.dragItemPositioned, layoutComplete), их можно
заменить на Isotope события: arrangeComplete,
layoutComplete, removeComplete.imagesLoaded для корректного расчета размеров изображений
перед инициализацией:imagesLoaded('.grid', function() {
iso.layout();
});
arrange с несколькими параметрами
одновременно:iso.arrange({
filter: '.active',
sortBy: 'name',
sortAscending: true
});
Миграция с Packery на Isotope требует внимательного подхода к позиционированию и логике анимации, но позволяет получить более гибкую и управляемую сетку с встроенными инструментами фильтрации, сортировки и анимации элементов.