Библиотека Isotope предоставляет мощные средства для динамической сортировки и фильтрации элементов на веб-странице. Сортировка по содержимому элементов позволяет упорядочивать блоки на основе текста, числовых значений или атрибутов, находящихся внутри элементов. В отличие от сортировки по классам или ключам, сортировка по содержимому анализирует внутреннюю структуру элемента и применяет алгоритм сравнения для определения порядка.
Основной метод, используемый для сортировки, — это
getSortData, который принимает объект с
ключами сортировки и функциями или селекторами для извлечения
данных.
var $grid = $('.grid').isotope({
itemSelector: '.grid-item',
layoutMode: 'fitRows',
getSortData: {
title: '.title', // текст внутри элемента с классом .title
number: function(itemElem) {
var number = $(itemElem).find('.number').text();
return parseFloat(number);
}
}
});
В этом примере title сортирует элементы
по тексту внутри .title, а
number — по числовому значению,
извлекаемому из .number.
Для текстовой сортировки можно указать простой CSS-селектор внутри
getSortData. Isotope автоматически извлекает текстовое
содержимое и приводит его к строковому виду.
getSortData: {
category: '.category' // сортировка по тексту внутри .category
}
Важно учитывать, что текст извлекается в виде строки, поэтому для сортировки чисел или дат требуется преобразование через функции.
Часто содержимое элементов представляет собой числа (цены, рейтинги,
количество просмотров). Для корректной сортировки необходимо
парсить текст в число с помощью parseInt
или parseFloat.
getSortData: {
price: function(itemElem) {
var priceText = $(itemElem).find('.price').text();
return parseFloat(priceText.replace('$', '')); // удаляем символ валюты
}
}
Функции сортировки могут быть сложными и включать несколько операций: удаление лишних символов, преобразование формата даты или работу с множественными подэлементами.
Isotope позволяет сортировать элементы не только по тексту, но и по
любым атрибутам HTML. Например, сортировка по
data- атрибуту:
getSortData: {
rating: '[data-rating] parseInt'
}
Здесь [data-rating] указывает селектор атрибута, а
parseInt сообщает Isotope, что значение нужно
интерпретировать как число. Такой подход позволяет легко интегрировать
сортировку с динамическими данными.
Иногда требуется сортировка по нескольким критериям одновременно. В
getSortData можно определить несколько ключей, а при вызове
метода arrange указывать приоритет:
$grid.isotope({
sortBy: ['category', 'price'],
sortAscending: {
category: true,
price: false
}
});
В этом примере элементы сначала сортируются по категории в порядке возрастания, а внутри каждой категории — по цене в порядке убывания.
Если содержимое элементов изменяется после инициализации Isotope (например, текст или атрибуты обновляются через AJAX), необходимо перезапустить сортировку:
$grid.isotope('updateSortData').isotope({ sortBy: 'price' });
Метод updateSortData пересчитывает значения всех
элементов для текущих ключей сортировки. Это гарантирует корректный
порядок при динамических изменениях данных.
Для реализации интерактивной сортировки по содержимому элементов часто используют кнопки или селекты. Пример с кнопками:
$('.sort-button-group').on('click', 'button', function() {
var sortValue = $(this).attr('data-sort-value');
$grid.isotope({ sortBy: sortValue });
});
Каждая кнопка содержит атрибут data-sort-value,
соответствующий ключу из getSortData. Такой подход
обеспечивает гибкую и понятную сортировку элементов на странице.
getSortData: {
name: function(itemElem) {
return $(itemElem).find('.name').text().toLowerCase();
}
}
Обработка пустых значений: Пустой текст или
отсутствующий атрибут может нарушить сортировку. Рекомендуется
возвращать значения по умолчанию, например 0 для чисел или
пустую строку для текста.
Оптимизация больших наборов: Для сотен и тысяч элементов рекомендуется минимизировать DOM-операции внутри функций сортировки. Использование кэширования или прямого обращения к атрибутам повышает производительность.
С помощью этих методов Isotope позволяет реализовать гибкую, динамическую и точную сортировку по содержимому элементов, обеспечивая высокую интерактивность интерфейсов и возможность работать с различными типами данных.