GreenSock Animation Platform (GSAP) - это всемирно известный набор инструментов для анимации на основе JavaScript, используемый на более чем 11 миллионах сайтов. Часть сайтов, которые используют GSAP, отмечены наградами. Этот набор инструментов облегчает жизнь разработчиков там, где нужно сделать сайт красиво и быстро. Основная библиотека содержит все необходимое для создания кроссбраузерных анимаций. Официальный сайт - gsap.com
В этой статье мы рассмотрим:
- Подключение GSAP к html-файлу
- Синтаксис GSAP
- Метод set()
- Метод to()<
- Какие единицы измерений использовать?
- Методы from() и fromTo()
- Функции play(), pause(), seek(), resume(), restart(), reverse()
- Обработчики событий анимации
- Timeline в GSAP
- Примеры
Подключаем GSAP к html-файлу
В этой статье мы и рассмотрим ряд методов для работы с GSAP, и начнем мы с того, где ее взять. Поскольку это js-библиотека, то подключить ее можно отдельным файлом к вашему html-файлу, скачав с оффсайта, или воспользоваться ссылкой с CDN. Имеенно последним способом мы и будем добавлять в html-код тег <script>
.
1 2 3 4 5 6 7 8 9 | <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script> или <script src="https://cdn.jsdelivr.net/npm/gsap@3.12/dist/gsap.min.js"></script> или <script src="https://unpkg.co/gsap@3/dist/gsap.min.js"></script> |
Кроме основной библиотеки, существует еще много дополнительных плагинов, как платных, так и бесплатных, но здесь мы их задействовать не будем.
После того, как вы подключили GSAP, вам придется аналогичным образом подключить и свой js-файл, в котором вы будете писать код для ваших элементов. Коль вы здесь, предполагаю, что вы знаете, как это сделать.
Синтаксис GSAP
В самом начале синтаксис будет очень простым: вам нужно указать объект gsap, метод и в скобках целевой элемент(-ы) (target(s)) в виде css-селектора в кавычках и параметры в виде пар свойство: значение
в фигурных скобках (vars).
Естественно, для ваших элементов должны быть заданы какие-то css-свойства, так как их довольно часто приходится менять в процессе анимации.
Целевой объект(-ы) в GSAP
Здесь все очень просто - как правило, вы указываете в качестве целевого объекта селектор нужного элемента, но также можно использовать переменную, заданную в js-коде. Несколько переменных можно указывать в виде массива.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // используем класс или ID gsap.to(".box", { x: 200 }); // сложный CSS селектор gsap.to("section > .box", { x: 200 }); // переменная let box = document.querySelector(".box"); gsap.to(box, { x: 200 }) // массив элементов let square = document.querySelector(".square"); let circle = document.querySelector(".circle"); gsap.to([square, circle], { x: 200 }) |
Теперь давайте рассмотрим методы для создания анимации.
Метод set()
Метод set()
позволяет установить какие-либо параметры для вашего объекта без анимации.
1 2 3 4 | //Общий вид записи gsap.set(element, { vars }); //Пример gsap.set('.ball', { x: 100, opacity: 0.5 }); |
Метод to()
Метод to()
позволяет запустить анимацию от того состояния, которое было у объекта до данного момента к тому, свойства которого вы описываете в фигурных скобках.
1 2 3 4 | //общий вид gsap.to(element, { vars }); //параметры анимации gsap.to(".ball", { duration: 1, x: 100, opacity: 0.5, repeat: -1, yoyo: true }); |
Здесь вы можете указывать какие-либо параметры в виде CSS-свойств, например,
background, borderRadius, fontSize
- в виде координат:
x
- смещение по горизонтали (аналогtransform: translateX(число)
),y
- смещение по вертикали (аналогtransform: translateY(число)
),xPercent: 50
- аналог transform: translateX(50%)
,yPercent: 50
- аналогtransform: translateY(50%)
; rotation
: 360 - поворот на указанное цифрой количество градусов;scale: 2
- увеличение масштаба в 2 раза;duration
- число секунд для анимации;delay
- задержка перед анимацией в секундах;repeat
- количество повторов анимации (целое число). При указании -1 вы создаете бесконечную анимацию;yoyo
- повтор анимации от начала в конец, а потом наоборот - от конца в начало - вариант создания зацикленности;onComplete
- функция, которая запускается после завершения анимации.
Все параметры вы найдете на официальном сайте и на странице Greensock Cheatsheet.
Пример для методов set()
и to()
See the Pen GSAP set() and to() simple usage by Elen (@ambassador) on CodePen.
Какие единицы измерений использовать?
Для многих css-свойств в качестве единиц изменений подходят пиксели, поэтому они приняты в GSAP по умолчанию. Однако, есть еще ряд вариантов:
1 2 3 4 5 6 7 | x: 200, // по умолчанию в px x: "+=200" // относительные значения x: '40vw', // строка с любыми единицами x: () => window.innerWidth / 2, // вы даже можете использовать функциональные значения для вычислений! rotation: 360 // используйте градусы по умолчанию rotation: "1.25rad" // используйте радианы |
Методы from() и fromTo()
Методы from()
и fromTo()
используют те же параметры, что и метод to()
, но from()
задает, от каких параметров будет идти анимация до текущего состояния элемента.
1 2 3 4 5 | //gsap.from() gsap.from(element, { duration: 1, x: 100, opacity: 0.5 }); //gsap.fromTo() gsap.fromTo(element, { x: -100 }, { duration: 1, x: 100 }); |
Метод fromTo()
предполагает, что вы задаете 2 блока параметров в фигурных скобках: первый отвечает за начальные значения анимации (аналогично методу from()
), а второй - за конечные параметры анимации (аналогично методу to()
).
В примере ниже для 2-х элементов задана GSAP-анимация, а 3-й указывает на их начальное положение на странице без анимации.
See the Pen GSAP from() and fromTo() simple usage by Elen (@ambassador) on CodePen.
Все методы еще раз можно посмотреть в примере от разработчиков GSAP
See the Pen gsap tweens by GSAP (@GreenSock) on CodePen.
Повторение анимации
Любую анимацию, которую вы назначаете с помощью методов gsap.to()
, gsap.from()
или gsap.fromTo()
можно сохранить в переменную и повторить либо с начала, используя метод restart()
, либо в обратном направлении с помощью метода reverse()
.
В примере ниже вы найдете такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | let boxAnimation = gsap.to(".box", { duration: 1, scale: 0.1, ease: "power1.inOut", repeat: 1, yoyo: true, stagger: { each: 0.1, from: "center", } }); document.body.addEventListener('click', () => { boxAnimation.restart(); }) |
Это позволяет воспроизводить анимацию по клику в любом месте body
в любой момент времени.
See the Pen GSAP Stagger effect grid:auto by Elen (@ambassador) on CodePen.
Другие методы описаны ниже.
Также вы можете использовать функцию delayedCall()
для того, чтобы повторить анимацию, сохраненную в переменной animateName
.
1 | gsap.delayedCall(2, () => animateName.restart()); |
Такой пример вы найдете чуть ниже.
Сама функция delayedCall()
позволяет вызвать любую функцию через заданное время, причем полностью синхронизировать ее со всем циклом рендеринга (в отличие от метода, setTimeout()
, который может срабатывать вне цикла обновления экрана браузера). При желании вы также можете передать в функцию любое количество параметров.
Общий вид ее таков:
1 2 3 4 5 6 | //вызывает myFunction() через 1 сек и передает 2 параметра: gsap.delayedCall(1, myFunction, ["param1", "param2"]); function myFunction(param1, param2) { //ваш код } |
Чтобы отменить/завершить отложенный вызов, сохраните ссылку на него в переменной, а затем вызовите для этой переменной метод kill()
при необходимости:
1 2 3 4 | var delayedCall = gsap.delayedCall(1, myFunction); // несколько позже delayedCall.kill(); |
Или, если вы не хотите сохранять ссылку на вызов delayedCall()
, вы можете использовать метод gsap.killTweensOf()
:
1 2 3 4 | gsap.delayedCall(1, myFunction); // несколько позже gsap.killTweensOf(myFunction); |
Параметр stagger
Этот параметр позволяет указать задержку анимации каждого элемента из набора. Например, значение stagger: 0.1
приведет к тому, что между временем начала каждой анимации будет интервал 0,1 секунды. Отрицательное значение будет делать то же самое, но в обратном порядке, так что последний элемент начинает анимацию первым.
1 2 3 4 | gsap.to(".box", { y: 100, stagger: 0.1, // 0.1 seconds between when each ".box" element starts animating }); |
Для этого параметра существуют расширенные опции, например:
1 2 3 4 5 6 7 8 9 10 11 | gsap.to(".box", { y: 100, stagger: { // оборачиваем дополнительные параметры в объект each: 0.1, from: "center", grid: "auto", ease: "power2.inOut", repeat: -1, // Повторяется немедленно, не дожидаясь завершения других анимаций. }, }); |
Опции перечислены в таблице ниже.
Свойство | Описание |
---|---|
amount | [Число]: общее количество времени (в секундах), которое распределяется между всеми колебаниями. Таким образом, если так и есть 100 элементов, которые колеблются линейно, между временем начала каждого субанимации будет 0,01 секунды. Если вы предпочитаете указывать определенный промежуток времени между каждой анимацией, используйте вместо этого свойство each |
each | [Число]: интервал времени (в секундах) между временем начала каждого субанимационного анимации. Таким образом, если да (независимо от количества элементов), между временем начала каждого субанимации будет 1 секунда. Если вы предпочитаете указать общее количество времени для разделения между ступенями, используйте вместо этого свойство amount |
from | [Строка | Целое число | Массив] : позиция в массиве, из которой будет исходить шатание. Например, чтобы начать с конкретного элемента, используйте число, представляющее индекс этого элемента в целевом массиве. Итак, для того чтобы начать с 5-го элемента массива, используйте from:4 (поскольку в массивах используются индексы, отсчитываемые от нуля). Анимация для каждого элемента начнется в зависимости от близости элемента к значению «from» в массиве (чем ближе оно, тем раньше оно начнется). Вы также можете использовать следующие строковые значения:"start" , "center" , "edges" , "random" , or "end" или ("random" было добавлено в версии 3.1.0). Если у вас есть значение grid , вы можете указать десятичные значения, указывающие прогресс по каждой оси, например, [0.5,0.5] - по центру, [1,0] - верхний правый угол и т. д. По умолчанию: 0 |
grid | [Массив | «auto»] : если элементы отображаются визуально в сетке, укажите количество строк и столбцов (например, grid:[9,15] ), чтобы GSAP мог соответствующим образом рассчитать близость. Или используйте grid:"auto" , чтобы GSAP автоматически рассчитывал строки и столбцы на основе element.getBoundingClientRect() (отлично подходит для адаптивных макетов). Предполагается, что сетки располагаются сверху слева в правом нижнем углу (как текст, который обтекает правый край). Или, если ваши элементы не расположены в единой сетке, воспользуйтесь созданной нами вспомогательной функцией distributeByPosition() |
axis | [строка] : если вы определяете grid , сдвиги основаны на общем расстоянии каждого элемента до значения "from" по осям x и y, но вы можете сосредоточиться только на одной оси, если хотите ("x" или "y" ) . Используйте приведенную ниже демонстрацию, чтобы увидеть эффект |
ease | [Строка | Функция]: Распределение времени шкалы анимации. Все значения можно найти на оффсайте. Например, для значения "power2" мы начнем с больших промежутков, а затем к концу сгруппируемся более плотно. По умолчанию: "none" |
Пример от создателей GSAP
See the Pen Simple stagger demo - GSAP 3 by GreenSock (@GreenSock) on CodePen.
В этом примере можно раскомментировать параметр stagger: o.1
для того чтобы посмотреть, как меняется анимация появления и исчезновения кнопок с его добавлением. Чтобы повторить анимацию исчезновения кнопок, необходимо кликнуть в любом месте примера. Через 2 секунды кнопки снова появятся.
See the Pen GSAP 3 Staggered menu animation by GSAP (@GreenSock) on CodePen.
Пример ниже демонстрирует возможности анимации блоков в виде сетки с параметром stagger
. В коде закомментирован параметр axis: "x"
. Раскомментируйте его и снова запустите анимацию. Сделайте то же для параметра axis: "y"
.
See the Pen GSAP Stagger effect grid:auto by Elen (@ambassador) on CodePen.
В этом примере от создателей GSAP вы можете посмотреть, как различные опции влияют на вид анимации. Здесь вы можете задать настройки timeline
сразу для множества объектов, используя сетку (grid
) и получить очень интересные варианты анимации с помощью параметра stagger
.
See the Pen Advanced staggers for embedding by GSAP (@GreenSock) on CodePen.
Параметр ease
Параметр ease
уже встречался в таблице. В переводе это замедление, а по сути это вариант распределения анимации относительно временной шкалы.
Основные виды замедлений: none, power1, power2, power3, power4.(in, inOut, out), back, bounce, circ, elastic, expo, sine, steps. Дополнительные: rough, slow, expoScale, CustomEase.
Использование в коде:
1 2 3 4 5 | gsap.to(".box", { duration:2.5, ease: "power4.out", rotation: 360 }); |
По ссылке вы найдете интерактивный пример, в котором можно посмотреть на разницу в анимациях с разными видами ease
.
Функции play(), pause(), seek(), resume(), restart(), reverse()
Вы можете управлять анимацией, останавливая ее на паузу, проигрывая с того места, где анимация была остановлена, и заново проигрывается с начала. За это отвечают функции play()
, pause()
и restart()
. Если вы остановили анимацию кликом на кнопку pause
, то запустить ее поможет метод play()
(анимация проигрывается с начала и до конца) или resume()
(проигрывает анимацию в том направлении в котором она шла до остановки), а начать анимацию с конца и воспроизвести ее к началу, т.е. в обратном порядке, позволит функция (или метод) restart()
. Для повторения анимации предназначена функция repeat()
.
Функция seek(time)
позволяет указать в скобках время, с которого начнется воспроизведение анимации.
Их использование представлено в примере ниже. Для их использования вызов одного из вышеописанных методов нужно сохранить в переменной.
See the Pen GSAP Tween play(), pause(), resume() by Elen (@ambassador) on CodePen.
Обработчики событий анимации
К обработчикам событий анимации относятся параметры, которые вы можете использовать для назначения неких функций. Вы можете выбрать из списка:
onStart
- наступает в начале анимации (когда ее время меняется с 0 на какое-либо другое значение, что может произойти более одного раза, если анимация перезапускается несколько раз). Параметры в виде массива можно передать вonStartParams
.onRepeat
- наступает при повторении анимации. Параметры в виде массива можно передать вonRepeatParams
.onReverseComplete
- наступает по окончании обратной анимации. Параметры в виде массива можно передать вonReverseCompleteParams
onUpdate
- функция, вызываемая каждый раз при обновлении анимации (при каждом «тике», перемещающем точку воспроизведения). Параметры в виде массива можно передать вonUpdateParams
.onComplete
- наступает при завершении анимации. Параметры в виде массива можно передать вonCompleteParams
.
В примере ниже вы найдете использование функции для назначения свойства backgroundColor
, а также использование onComplete
для вызова обратной анимации с помощью anim.reverse()
и повторение анимации при наступлении onReverseComplete
. Все то же самое можно было сделать параметрами {repeat: -1, yoyo: true }
, но здесь целью было показать использование кастомных функций для обработки 2-х событий.
Кроме того, в консоли вы найдете вывод данных, которые можно получить из текущей анимации. Например, this.targets()
- это функция, которая позволяет получить доступ к массиву объектов, участвующих в анимации, а this.vars.duration
или this.duration()
- к количеству секунд на воспроизведение анимации. Вообще объект this.vars
содержить все ваши переданные параметры. Учтите, что для использования this
в качестве доступа к Twen (анимации) вам понадобится функция, объявленная с помощью ключевого слова function ()
(так называемая Function Declaration).
See the Pen Untitled by Elen (@ambassador) on CodePen.
При назначении обработки всех событий вы можете использовать стрелочные функции. Но тут надо понимать, каким образом вы можете (или НЕ можете) использовать ключевое слово this
. Нужно понимать, что стрелочные функции берут this
из окружения, поэтому вы можете обращаться к объекту Window, а не к вашей анимации. Иногда выходом может быть указание параметра callbackScope
или создание своего класса для объектов, как в примере ниже.
See the Pen GSAP tween onComplete by Elen (@ambassador) on CodePen.
Timeline в GSAP
Timeline, или временная шкала — это ключ к созданию легко настраиваемых и гибких последовательностей анимаций. Когда вы добавляете анимацию на временную шкалу, по умолчанию они воспроизводятся один за другим в том порядке, в котором они были добавлены. Причем количество времени на каждую анимацию вы можете задавать произвольно или одинаково для всех переходов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | let TL = gsap.timeline(); TL.to('.ball1', { duration: 2, scale: 0, opacity: 0, delay: 1 }).to('.ball2', { duration: 2, x: -200 }).to('.ball3', { duration: 2, x: -200, borderRadius: 0, rotate: 360 }).set('.ball1', { duration: 2, scale: 1, opacity: 1, x: 130 }) |
При воспроизведении анимации она сначала отыграется для левого элемента, потом для центрального, потом для правого и снова для левого, который в конце окажется справа в силу того, что остальные элементы сместились.
See the Pen GSAP Timeline by Elen (@ambassador) on CodePen.
Примерно такого же эффекта можно достичь с помощью задержек (параметр delay
), но управление Timeline намного эффективнее. Параметр stagger
также позволяет получать воспроизведение анимаций для разных элементов друг за другом, но сама анимация будет по сути одной и той же.
Во втором примере вы найдете параметры по умолчанию (defaults
), которые сработают для всех элементов, перечисленных в анимации через Timeline.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | let TL = gsap.timeline({ defaults: { duration: 1, borderRadius: 0, ease: "bounce" } }); TL.to('.text h2', { color: "red", fontSize: '2.5em', y:50 }).to('.ball1', { backgroundColor: "pink", x: -100, }).to('.ball2', { backgroundColor: "crimson", y: 100 }).to('.ball3', { backgroundColor: "#8B0000", x: 100, }) |
Протестируйте сами.
See the Pen GSAP Timeline 12 example by Elen (@ambassador) on CodePen.
А теперь давайте рассмотрим, как можно использовать GSAP на страницах сайтов.
Примеры
Пример использования методов GSAP для анимации изображений
See the Pen GSAP Image Animation by Elen (@ambassador) on CodePen.
Анимация фигур
See the Pen Color swappy by Steve Gardner (@ste-vg) on CodePen.
Вариант появления элементов страницы сайта
See the Pen GSAP Simple Project by Elen (@ambassador) on CodePen.
Корисна інформація. Дякую.