Snap-эффекты в библиотеке Packery позволяют элементам сетки «прилипать» к ближайшим доступным позициям при перемещении или изменении размера. Это улучшает визуальную согласованность расположения и обеспечивает аккуратное выравнивание без необходимости ручной подгонки координат.
Packery использует сетки с плавающими элементами,
где каждый блок может иметь произвольный размер. Snap-эффект реализуется
через метод stamp и систему координат,
которая отслеживает свободные позиции. При включенном snap-эффекте
каждый блок, перемещаемый с помощью Draggabilly или
Draggable (в зависимости от версии), автоматически
«прилипает» к ближайшей точке сетки.
Ключевые моменты:
columnWidth и rowHeight.Для включения snap-эффекта используется комбинация параметров:
var pckry = new Packery( '.grid', {
itemSelector: '.grid-item',
gutter: 10,
columnWidth: 100,
rowHeight: 100
});
Здесь columnWidth и
rowHeight определяют шаг сетки, к которому
будут «прилипать» элементы. Если rowHeight не задан, Packery
автоматически использует ширину колонок для вертикального
выравнивания.
Для активации snap при drag-and-drop элементы интегрируются с Draggabilly:
var itemElems = pckry.getItemElements();
for ( var i=0; i < itemElems.length; i++ ) {
var draggie = new Draggabilly( itemElems[i] );
pckry.bindDraggabillyEvents( draggie );
}
Важные особенности:
gutter.Новые блоки, добавляемые динамически, также можно снабдить
snap-эффектом. Для этого используется метод
appended:
var newElem = document.createElement('div');
newElem.className = 'grid-item';
grid.appendChild(newElem);
pckry.appended(newElem);
pckry.layout(); // пересчет позиций с применением snap
Особенности:
Packery позволяет использовать snap не только для фиксированных сеток, но и для резиновых (flexible) контейнеров. Для этого:
columnWidth и rowHeight задаются в
процентах или через CSS calc().window.resize.Пример:
var pckry = new Packery('.grid', {
itemSelector: '.grid-item',
gutter: '.gutter-sizer',
columnWidth: '.grid-sizer'
});
Здесь .grid-sizer и .gutter-sizer задаются
через CSS, что позволяет сетке быть адаптивной, при этом элементы
продолжают «прилипать» к сетке при перемещении.
Snap-эффекты могут создавать нагрузку при большом количестве элементов. Рекомендации:
layoutOnDrag: false), а завершать пересчет
после dragEnd.Packery позволяет тонко настраивать «жесткость» snap:
snapTolerance — расстояние в пикселях, в пределах
которого элемент «прилипает» к сетке.gutter — минимальный промежуток между элементами.transitionDuration — длительность анимации перемещения
элемента к snap-позиции.Пример настройки snap:
var pckry = new Packery('.grid', {
itemSelector: '.grid-item',
gutter: 10,
columnWidth: 120,
rowHeight: 120,
transitionDuration: '0.2s'
});
Благодаря этому элементы перемещаются плавно и предсказуемо, создавая визуально приятный интерфейс с аккуратной сеткой.
Snap-эффекты в Packery обеспечивают комбинацию гибкости и точности, позволяя создавать динамические сетки с аккуратным позиционированием элементов без сложных вычислений координат вручную.