Masonry — это мощная библиотека для динамической компоновки сетки элементов, которая предоставляет гибкую систему для управления позиционированием блоков. Помимо стандартных методов и настроек, библиотека позволяет создавать кастомные методы, расширяющие функциональность и адаптирующие поведение сетки под специфические задачи.
Кастомные методы обычно используются для:
Кастомный метод в Masonry представляет собой функцию, которая получает два ключевых параметра:
items — массив DOM-элементов,
участвующих в раскладке. Каждый элемент обёрнут объектом
Masonry.Item.callback — функция, вызываемая после
завершения операции, чтобы Masonry мог обновить позиции элементов.Простейший пример кастомного метода:
Masonry.prototype.filterItems = function(filterFn, callback) {
const filteredItems = this.items.filter(item => filterFn(item.element));
this.layoutItems(filteredItems);
if (callback) callback(filteredItems);
};
Здесь filterFn — функция, определяющая, какие элементы
отображать, а layoutItems — встроенный метод Masonry,
пересчитывающий позиции видимых элементов.
Cоздавая кастомные методы, важно учитывать работу внутренних методов Masonry:
layoutItems(items) — перерасчёт
позиций для указанного набора элементов.reloadItems() — обновление массива
this.items на основе текущих DOM-элементов.stamp(elements) — «закрепление»
элементов, которые не должны перемещаться при компоновке.Кастомные методы часто комбинируют эти функции. Например, метод для скрытия элементов с последующей анимацией:
Masonry.prototype.hideAndLayout = function(selector) {
const itemsToHide = this.items.filter(item => item.element.matches(selector));
itemsToHide.forEach(item => {
item.element.style.transition = 'opacity 0.3s';
item.element.style.opacity = 0;
});
setTimeout(() => {
itemsToHide.forEach(item => this.remove(item.element));
this.layout();
}, 300);
};
Здесь используется встроенный метод remove для удаления
элемента из сетки, а layout — для перестройки сетки после
изменения видимости.
Для систематического добавления кастомных методов удобно использовать прототип:
Masonry.prototype.customMethod = function(options) {
this.items.forEach(item => {
if (options.condition(item.element)) {
options.action(item.element);
}
});
this.layout();
};
Такой подход позволяет создавать универсальные функции, применяемые к любой сетке Masonry, и поддерживать единый стиль работы с элементами.
Masonry поддерживает события, которые можно использовать для улучшения кастомных методов:
layoutComplete — вызывается после
завершения перестройки сетки.removeComplete — вызывается после
удаления элементов.appendComplete — вызывается после
добавления новых элементов.Пример интеграции событий:
Masonry.prototype.fadeInNewItems = function(newElements) {
const fragment = document.createDocumentFragment();
newElements.forEach(el => {
el.style.opacity = 0;
fragment.appendChild(el);
});
this.element.appendChild(fragment);
this.appended(newElements);
newElements.forEach(el => {
el.style.transition = 'opacity 0.5s';
el.style.opacity = 1;
});
this.on('layoutComplete', () => {
console.log('Новая раскладка завершена');
});
};
Метод appended автоматически обновляет массив
this.items, а событие layoutComplete позволяет
синхронизировать последующие действия, например, подключение внешних
плагинов или lazy-loading изображений.
Минимизация повторного рендеринга Использовать
DocumentFragment для вставки нескольких элементов за один
раз, чтобы уменьшить количество пересчётов позиций.
Фильтрация перед добавлением в сетку Проверять
элементы до вызова appended или layoutItems,
чтобы исключить ненужные элементы из DOM.
Использование встроенных анимаций Masonry
Встроенные свойства transitionDuration и
transitionProperty позволяют синхронизировать кастомные
методы с анимацией перестройки сетки.
Асинхронные операции Если кастомный метод
взаимодействует с API, использовать async/await и вызывать
layout только после полной загрузки контента.
Masonry.prototype.sortByAttribute = function(attr) {
const sorted = this.items.sort((a, b) => {
return a.element.getAttribute(attr) > b.element.getAttribute(attr) ? 1 : -1;
});
this.layoutItems(sorted);
};
Masonry.prototype.groupByCategory = function(categoryFn) {
const groups = {};
this.items.forEach(item => {
const category = categoryFn(item.element);
if (!groups[category]) groups[category] = [];
groups[category].push(item);
});
return groups;
};
Masonry.prototype.staggeredReveal = function() {
this.items.forEach((item, index) => {
item.element.style.opacity = 0;
setTimeout(() => {
item.element.style.transition = 'opacity 0.4s';
item.element.style.opacity = 1;
}, index * 100);
});
};
Эти примеры показывают гибкость подхода и возможности Masonry при кастомизации поведения сетки. Они позволяют создавать сложные, интерактивные интерфейсы, не нарушая основную логику библиотеки и сохраняя высокую производительность.