Isotope предоставляет возможность не только сортировать элементы по
стандартным атрибутам, таким как дата, имя или числовое значение, но и
создавать пользовательские функции сортировки, которые
определяют порядок элементов на странице по любым критериям. Для этого
используется опция getSortData, позволяющая задать
собственные методы извлечения данных для каждого элемента.
var $grid = $('.grid').isotope({
itemSelector: '.grid-item',
layoutMode: 'fitRows',
getSortData: {
name: '.name', // стандартная сортировка по тексту
price: function(itemElem) {
return parseFloat($(itemElem).find('.price').text().replace('$', ''));
},
rating: function(itemElem) {
return parseInt($(itemElem).attr('data-rating'));
}
}
});
В этом примере:
name извлекается через селектор
.name.price вычисляется через функцию, которая преобразует
текст в число.rating берется из атрибута
data-rating.Функции сортировки могут быть любого уровня
сложности, включая вычисления на основе нескольких элементов
внутри одного grid-item. Например, сортировка по сумме
нескольких параметров:
getSortData: {
popularityScore: function(itemElem) {
var views = parseInt($(itemElem).find('.views').text());
var likes = parseInt($(itemElem).find('.likes').text());
return views + likes * 2; // комбинированный показатель
}
}
Такой подход позволяет формировать индивидуальные метрики, недоступные через стандартные атрибуты, и использовать их для динамической перестановки элементов.
Для сортировки в обратном порядке используется свойство
sortAscending. Оно может быть массовым для всех
критериев или индивидуальным для каждой функции:
$grid.isotope({
getSortData: {
price: '.price parseFloat',
rating: '[data-rating] parseInt'
},
sortBy: 'price',
sortAscending: {
price: true, // по возрастанию
rating: false // по убыванию
}
});
Пользовательские функции могут возвращать не только числа или строки, но и комбинации данных для сложных правил. Например, сортировка по алфавиту, а затем по числовому значению:
getSortData: {
combined: function(itemElem) {
var category = $(itemElem).find('.category').text().toLowerCase();
var score = parseFloat($(itemElem).find('.score').text());
return category + '-' + score.toString().padStart(5, '0');
}
}
Такой метод объединяет текст и число, обеспечивая приоритет текстовой сортировки, а затем числовой.
Isotope позволяет менять критерий сортировки на лету, без пересоздания сетки:
$grid.isotope({ sortBy: 'rating' });
$grid.isotope({ sortBy: 'price' });
Можно также использовать пользовательские функции в комбинации с кнопками управления сортировкой:
$('.sort-button').on('click', function() {
var sortValue = $(this).attr('data-sort-by');
$grid.isotope({ sortBy: sortValue });
});
Функции сортировки вызываются для каждого элемента при каждой перестановке. Чтобы не снижать производительность на больших сетках:
getSortData: {
cachedPrice: function(itemElem) {
var $item = $(itemElem);
if (!$item.data('cachedPrice')) {
$item.data('cachedPrice', parseFloat($item.find('.price').text().replace('$','')));
}
return $item.data('cachedPrice');
}
}
Можно реализовать несколько уровней сортировки, используя массивы критериев:
$grid.isotope({
sortBy: ['category', 'price'],
getSortData: {
category: '.category',
price: function(itemElem) {
return parseFloat($(itemElem).find('.price').text());
}
}
});
Элементы сначала сортируются по категории, а внутри каждой категории — по цене.
Функции могут опираться на внешние источники данных, например, результаты AJAX-запросов:
getSortData: {
externalScore: function(itemElem) {
var id = $(itemElem).data('id');
return externalScores[id] || 0;
}
}
Это позволяет интегрировать динамическую сортировку на основе пользовательских предпочтений, статистики или рейтингов.
sortAscending и массивов
sortBy позволяет строить многоуровневые схемы
сортировки.Эти методы делают Isotope гибким инструментом для любых задач визуальной организации контента и позволяют создавать уникальные пользовательские сценарии сортировки.