Muuri — это мощная библиотека для создания динамических сеток с поддержкой перетаскивания, сортировки и фильтрации элементов. Помимо базовых функций, Muuri предоставляет расширяемый API, который позволяет добавлять кастомные функции, события и модифицировать поведение сетки на низком уровне. В этой главе рассматривается расширение возможностей Muuri через его API.
Muuri позволяет добавлять пользовательские методы к
экземплярам сетки, расширяя базовый функционал. Это делается
через прототип Muuri.prototype.
Пример добавления метода для подсчета видимых элементов:
Muuri.prototype.countVisible = function() {
return this.getItems().filter(item => item.isVisible()).length;
};
const grid = new Muuri('.grid');
console.log(grid.countVisible());
Ключевые моменты:
getItems() и
isVisible() обеспечивает интеграцию с базовым функционалом
Muuri.Muuri поддерживает богатую систему событий, которые можно использовать для расширения функционала сетки. События делятся на несколько категорий:
add,
remove, show, hide,
move.dragStart,
dragMove, dragEnd.layoutStart,
layoutEnd, filter, sort.Пример подписки на события и выполнения пользовательского действия:
grid.on('add', items => {
console.log(`Добавлено ${items.length} элементов`);
});
grid.on('dragEnd', item => {
console.log(`Элемент ${item.getElement().textContent} перемещён`);
});
Особенности использования событий:
item или массив
items, что позволяет точно управлять элементами.Muuri предоставляет API для динамической фильтрации и сортировки элементов, но можно создать и собственные методы, интегрирующиеся с системой сетки.
Пример пользовательской фильтрации по атрибуту
data-category:
grid.filter(item => {
return item.getElement().dataset.category === 'featured';
});
Для кастомной сортировки можно использовать функцию:
grid.sort((a, b) => {
const valA = parseInt(a.getElement().dataset.priority, 10);
const valB = parseInt(b.getElement().dataset.priority, 10);
return valB - valA; // сортировка по убыванию приоритета
});
Важные моменты:
Muuri поддерживает подключение плагинов, которые могут модифицировать поведение сетки или отдельных элементов. Плагины представляют собой функции, принимающие экземпляр сетки и выполняющие необходимые изменения.
Пример простого плагина, который подсвечивает элементы при добавлении:
function highlightPlugin(grid) {
grid.on('add', items => {
items.forEach(item => {
item.getElement().style.border = '2px solid red';
});
});
}
const grid = new Muuri('.grid', { layoutOnInit: true });
highlightPlugin(grid);
Особенности плагинов:
Хотя большинство функций Muuri документированы, библиотека
предоставляет и приватные методы, которые могут быть
использованы для глубокой кастомизации. Пример — прямой вызов
grid._sort() для обновления порядка элементов без
перестройки сетки:
grid._sort((a, b) => a.id - b.id, { layout: false });
Особенности:
Muuri позволяет кастомизировать поведение
перетаскивания через опции dragSort,
dragStartPredicate и события.
Пример ограничения перетаскивания по условию:
grid.on('dragStart', item => {
if(item.getElement().classList.contains('fixed')) {
return false; // запрещаем перемещать элементы с классом fixed
}
});
Возможности расширения Drag-and-Drop:
dragSort с другими
сетками).dragMove и dragEnd
для динамических изменений стилей или данных.API Muuri позволяет оперативно изменять DOM и стили
элементов, что важно при расширении функционала сетки. Методы
getElement(), getItems() и
isVisible() дают полный контроль над внешним видом и
состоянием элементов:
grid.getItems().forEach(item => {
const el = item.getElement();
el.style.transition = 'transform 0.5s ease';
});
Особенности:
Расширения часто используют API Muuri для динамического добавления или удаления элементов на основе внешних данных (например, из API или базы данных).
Пример добавления элементов из массива:
const data = [
{ id: 1, title: 'Item 1' },
{ id: 2, title: 'Item 2' }
];
const elements = data.map(d => {
const el = document.createElement('div');
el.className = 'item';
el.textContent = d.title;
el.dataset.id = d.id;
return el;
});
grid.add(elements);
Особенности:
API расширения Muuri открывает практически безграничные возможности для кастомизации сеток, позволяя создавать уникальные интерфейсы с динамическими элементами, сложной логикой перетаскивания, фильтрации и сортировки. Использование прототипов, событий, плагинов и приватных методов обеспечивает полный контроль над сеткой на любом уровне.