Библиотека Masonry для JavaScript предоставляет возможность создавать динамические сетки с “кирпичной” компоновкой, где элементы располагаются оптимально по высоте. Помимо стандартного поведения, Masonry поддерживает кастомные функции сортировки, которые позволяют управлять порядком отображения элементов в сетке по любым критериям.
Кастомная сортировка реализуется через параметр
sortBy и сопутствующие функции
sortAscending и getSortData.
getSortDatagetSortData — это объект, в котором ключи соответствуют
названиям методов сортировки, а значения — функции или строки-селекторы,
возвращающие значение для сортировки.
Пример базовой конфигурации:
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10,
getSortData: {
name: '.name', // значение берется из текстового содержимого элемента с классом .name
price: '.price parseInt', // значение берется и преобразуется в число
date: function(itemElem) {
return Date.parse(itemElem.querySelector('.date').textContent);
}
}
});
.name возвращает
текст элемента..price parseInt позволяет сразу преобразовать строку в
число.sortBy и sortAscendingПосле определения getSortData можно сортировать элементы
сетки, передавая имя ключа в параметр sortBy:
msnry.arrange({ sortBy: 'price', sortAscending: true });
getSortData.true для возрастания, false для
убывания).Примеры:
msnry.arrange({ sortBy: 'name', sortAscending: true });
msnry.arrange({ sortBy: 'date', sortAscending: false });
Иногда требуется сложная логика сортировки, например, комбинировать
несколько критериев. Для этого в getSortData можно
определить функцию, которая возвращает значение, по которому будет
происходить упорядочивание.
Пример комбинированной сортировки:
getSortData: {
popularityAndPrice: function(itemElem) {
var popularity = parseInt(itemElem.querySelector('.popularity').textContent);
var price = parseFloat(itemElem.querySelector('.price').textContent);
return popularity * 1000 - price; // комбинируем два критерия
}
}
Masonry позволяет менять порядок элементов динамически:
var currentSort = 'name';
function toggleSort() {
currentSort = (currentSort === 'name') ? 'price' : 'name';
msnry.arrange({ sortBy: currentSort });
}
При вызове arrange сетка перерасполагается, сохраняя
анимацию и плавность переходов.
Если элементы сетки имеют кастомные атрибуты data-*, их
также удобно использовать в функциях сортировки.
getSortData: {
rating: function(itemElem) {
return parseFloat(itemElem.getAttribute('data-rating'));
}
}
Это позволяет полностью отделить визуальное содержание от логики сортировки и работать с данными напрямую, без дополнительных скрытых элементов.
Часто нужно сначала отфильтровать элементы по определённому критерию, а затем отсортировать их. Masonry позволяет объединять эти операции:
msnry.arrange({
filter: function(itemElem) {
return itemElem.querySelector('.category').textContent === 'electronics';
},
sortBy: 'price'
});
true
для элементов, которые должны быть видимы.parseInt или parseFloat.Date.parse.msnry.arrange().Использование кастомных функций сортировки в Masonry открывает гибкие возможности для управления расположением элементов по любым данным: тексту, числам, датам, атрибутам и сложным вычислениям. Это позволяет строить динамические, интерактивные сетки, полностью адаптированные под потребности проекта.