Функция snap в GSAP предназначена для привязки
значений к дискретным шагам или фиксированным точкам. Она
особенно полезна при создании анимаций, где требуется точное
позиционирование, округление значений или ограничение движения объектов
определёнными границами.
snapПривязка к числовым шагам Самый простой вариант — привязка к числовому шагу.
gsap.to(".box", {
x: 0,
duration: 2,
snap: {
x: 50
}
});
В этом примере любое изменение координаты x будет
округлено до ближайшего кратного 50. Если элемент
смещается на 73px, он “привяжется” к 50px; если на 89px — к
100px.
Привязка к массиву значений Можно задать конкретные точки привязки через массив:
gsap.to(".box", {
x: 0,
duration: 2,
snap: {
x: [0, 100, 200, 300]
}
});
Любое значение x будет выбрано из массива
наиболее близким к текущему.
Привязка через функцию snap может
принимать функцию для сложных вычислений:
gsap.to(".box", {
x: 0,
duration: 2,
snap: {
x: value => Math.round(value / 25) * 25
}
});
Такой подход позволяет гибко настраивать шаги и правила округления, например для дробных или динамически вычисляемых величин.
Snap работает не только с координатами x и
y, но и с другими свойствами анимации:
Скейл и поворот
gsap.to(".box", {
scale: 1.0,
rotation: 0,
duration: 1.5,
snap: {
scale: 0.25,
rotation: 15
}
});
Все значения будут округлены до ближайшего шага: масштаб к 0.25, 0.5 и т.д., поворот к 15°, 30° и т.д.
Цветовые значения GSAP поддерживает
snap даже для цветов, используя RGB или HEX
шаги, например для плавной палитры.
snap в анимациях перетаскиванияПри работе с Draggable привязка часто используется для
ограничения перемещений:
Draggable.create(".box", {
type: "x",
bounds: { minX: 0, maxX: 400 },
inertia: true,
snap: {
x: value => Math.round(value / 50) * 50
}
});
Здесь при отпускании мыши или пальца объект автоматически привязывается к ближайшей отметке с шагом 50px. Это позволяет создавать сеточные интерфейсы, карусели или пиксельные игры с точной подгонкой элементов.
stagger, modifiers и
yoyo.Динамическая привязка к ближайшему элементу списка
const positions = [0, 120, 240, 360];
gsap.to(".box", {
x: 0,
duration: 2,
snap: {
x: value => {
return positions.reduce((prev, curr) => Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev);
}
}
});Сочетание snap с модификатором для мягкой привязки
gsap.to(".box", {
x: 0,
duration: 2,
modifiers: {
x: gsap.utils.snap(50)
}
});
modifiers позволяет изменять значения на
лету, а snap задаёт жесткие точки
привязки.
snapmodifiers для максимальной гибкости в
динамических анимациях.Snap делает анимации более управляемыми и позволяет
легко создавать интерфейсы с точной подгонкой и визуально аккуратными
переходами.