Packery — это библиотека для динамической компоновки элементов на странице, позволяющая создавать сетки с нестандартной структурой и адаптивным расположением блоков. Одной из сильных сторон Packery является возможность расширять базовую функциональность с помощью кастомных методов. Эти методы позволяют не только управлять расположением элементов, но и внедрять собственную логику сортировки, фильтрации или анимации.
Кастомные методы работают на основе прототипа объекта Packery. Любой
метод, добавленный к Packery.prototype, становится
доступным для всех экземпляров сетки. Это открывает широкие возможности
для повторного использования кода и создания модульных расширений.
Для создания собственного метода используется стандартная запись через прототип:
Packery.prototype.highlightItem = function(itemElement) {
const item = this.getItem(itemElement);
if (item) {
item.element.style.border = "2px solid red";
}
};
Пояснения:
getItem(itemElement) — встроенный метод Packery,
возвращающий объект элемента сетки по его DOM-узлу.item.element — реальный DOM-элемент внутри объекта
PackeryItem.После добавления метода его можно вызвать для любого экземпляра сетки:
const grid = new Packery('.grid', { gutter: 10 });
grid.highlightItem(document.querySelector('.grid-item'));
Кастомные методы часто используются для работы сразу с несколькими элементами. Например, для изменения цвета всех элементов с определенным классом:
Packery.prototype.colorItems = function(selector, color) {
const items = this.items.filter(item => item.element.matches(selector));
items.forEach(item => {
item.element.style.backgroundColor = color;
});
};
Ключевые моменты:
this.items — массив всех элементов сетки Packery,
каждый из которых содержит объект с DOM-элементом и его
координатами.matches() позволяет проверять соответствие
CSS-селектору.Packery предоставляет базовую сортировку через
sortItems, но кастомные методы позволяют реализовать
собственную логику, например сортировку по атрибутам:
Packery.prototype.sortByData = function(attribute, ascending = true) {
this.items.sort((a, b) => {
const aValue = a.element.dataset[attribute];
const bValue = b.element.dataset[attribute];
return ascending ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);
});
this.layout();
};
Особенности:
dataset — стандартный способ хранения пользовательских
данных на DOM-элементах.layout(), чтобы перестроить
сетку с новыми позициями элементов.Кастомные методы можно использовать для внедрения событийной логики. Например, метод, который добавляет анимацию при клике на элемент:
Packery.prototype.animateOnClick = function() {
this.items.forEach(item => {
item.element.addEventListener('click', () => {
item.element.style.transform = 'scale(1.2)';
setTimeout(() => item.element.style.transform = 'scale(1)', 300);
});
});
};
Важные детали:
layoutComplete или dragItemPositioned.Packery поддерживает плагины, такие как Draggabilly или jQuery UI Draggable. Кастомные методы могут взаимодействовать с этими плагинами для расширения функционала:
Packery.prototype.makeDraggableWithHighlight = function() {
this.items.forEach(item => {
const draggie = new Draggabilly(item.element);
this.bindDraggabillyEvents(draggie);
draggie.on('dragStart', () => {
item.element.style.border = "2px dashed blue";
});
draggie.on('dragEnd', () => {
item.element.style.border = "";
});
});
};
Пояснения:
bindDraggabillyEvents — встроенный метод Packery для
синхронизации позиций с библиотекой Draggabilly.layout() после изменения порядка или
размера элементов — это гарантирует корректное
расположение.this.items как основу работы с
элементами — все элементы сетки уже представлены в этом
массиве.Кастомные методы Packery обеспечивают глубокую гибкость и контроль над сеткой, позволяя создавать динамические, интерактивные и визуально разнообразные интерфейсы, сохраняя при этом структуру и стабильность работы библиотеки.