Эффекты при скролле страницы можно получить, отслеживая событие onscroll или используя IntersectionObserver API. Однако библиотека GSAP предлагает вам также интересный плагин с названием ScrollTrigger. Приготовьтесь к длительному чтению - здесь вы найдете параметры, события, возможные анимации и практические примеры для использования плагина GSAP ScrollTrigger на страницах сайта.

Подключаем плагин ScrollTrigger

Для того чтобы использовать плагин ScrollTrigger, его нужно подключить вместе с основной библиотекой GSAP. Ниже приведены ссылки на версию 3.12, но вы всегда можете найти новую версию на официальном сайте. Там же находится и документация по плагину ScrollTrigger.

Для использования ScrollTrigger плагин нужно зарегистрировать строчкой gsap.registerPlugin(ScrollTrigger).

Если вы подключаете все скрипты в блоке <head> вашего html-файла, вам нужно еще будет добавить обработчик события DOMContentLoaded или onload:

Простое использование ScrollTrigger

Допустим у нас есть 3 элемента на странице, для которых вы хотите использовать анимацию с помощью GSAP метода to(), но эти элементы разделены на несколько экранов.  Понятно, что наверняка вы увидите анимацию только на первом экране, возможно, на втором и очень вряд ли на третьем, т.к. пока вы будете скролить вниз, анимация, скорей всего, уже закончится.

Какой выход? Либо назначить довольно большое значение для параметра duration в последней анимации, либо ... воспользоваться плагином ScrollTrigger. В самом простом варианте вам нужно записать параметр scrollTrigger: '.selector' внутри метода to(), а плагин запустит анимацию, как только вы доскролите до указанного селектора.

Например, у нас есть 3 блока с классами .box-a.box-b, .box-c, причем .box-a виден на экране сразу, а 2 других блока скрыты. Мы будем запускать анимацию .box-b в тот момент, когда он появится на экране:

Кроме того, мы привяжем к тому же .box-b и анимацию .box-c, поэтому в момент, когда вы доскролите до третьего блока, вы увидите, только часть его анимации. Однако такой вариант вполне подходит, если у вас 2 блока расположены на одном экране, не очень далеко друг от друга. Заметьте, что скорость анимации при этом у всех блоков одинаковая.

Пример вживую.

See the Pen GSAP SmoothTrigger by Elen (@ambassador) on CodePen.

И еще один вариант, но уже с анимацией по типу слайдера.

See the Pen Reveal Sections With GSAP &amp; ScrollTrigger (Right-to-Left Horizontal Animation) by Envato Tuts+ (@tutsplus) on CodePen.

Для того чтобы изменить какие-либо параметры, нажмите на кнопку edit-with-codepen и поменяйте их в редакторе.

Параметры ScrollTrigger

Краткое пояснение параметров:

  • trigger — элемент, к которому привязан ScrollTrigger.
  • start, end — начало и конец области, где работает анимация.
  • scrub — синхронизация со скроллом (true, либо число для плавности).
  • pin — "прикалывает" элемент, не дает ему прокручиваться.
  • toggleActions — поведение при входе/выходе в зону триггера.
  • markers — показывает визуальные маркеры начала/конца (удобно для отладки).

Пример использования параметров GSAP ScrollTrigger

See the Pen GSAP ScrollTrigger Example by HTML-plus (@ambassador) on CodePen.

Что демонстрирует этот пример:

ID элемента Что делает анимация Ключевые параметры
#box1 Сдвигается вправо при прокрутке scrub: true, start/end, markers
#box2 Вращается и фиксируется на экране pin: true, scrub, end: "+=300"
#box3 Увеличивается и появляется from(), toggleActions

Ну, а теперь о каждом параметре поговорим поподробнее.

Параметр toggleActions

Параметр toggleActions предназначен для того, чтобы сказать плагину, как должна отыгрываться анимация. Он может быть строкой с любой комбинацией значений через пробел.

Этими значениями плагин ScrollTrigger определяет, как связанная анимация управляется в четырех отдельных местах переключенияonEnter, onLeave, onEnterBack и onLeaveBack (в указанном порядке). По умолчанию установлено значение 'play none none none'. Значение onEnter подразумевает поведение анимации в момент, когда анимируемый объект появляется на экране, onLeave - когда вы прокручиваете скролл, и анимируемый объект скрывается вверху, onEnterBack - когда вы возвращаетесь к анимируемому объекту, т.е. он снова появляется на экране, а  onLeaveBack - когда вы снова прокручиваете страницу, и анимируемый объект исчезает.

Вы можете изменить ситуацию с воспроизведением анимации, задав другие значения:

See the Pen GSAP ScrollTrigger toggleActions by Elen (@ambassador) on CodePen.

В примере ниже вы можете посмотреть, как работают разные виды анимации, заданные параметром toggleActions. Здесь также можно переключать маркеры, о которых речь пойдет ниже.

See the Pen GSAP ScrollTrigger Cards Animation types by HTML-plus (@ambassador) on CodePen.

Параметры start, end и markers

Параметры start и end предназначены для указания того, в каком месте анимация должна начинаться и заканчиваться. В любом из них вы указываете строку из 2-х значений, в которых могут присутствовать ключевые слова "top", "center", "bottom", а также любые css-единицы измерений, например, 100px, 20vh или 70%.

В каждом из этих параметров обычно вы задаете 2 значения, например start: 'top 50vh'. В этом случае 'top' определяет, что верхняя часть анимируемого объекта должна достигнуть центра ('center') видимой области экрана (англ. viewport). По умолчанию start: "top bottom" и end: "bottom top".

В примере ниже мы меняем параметр start на "top center", и анимация начинается, когда верхняя часть анимируемого объекта дойдет до середины экрана. Закончится она через 2 секунды, но если вы будете перемещать скролл так, чтобы анимируемый объект периодически уходил вверх, а потом опять появлялся, то за счет параметра toggleActions со значением reverse, обратная анимация будет начинаться, когда совпадут метки end и scroller-end.

Код примера:

Сам пример:

See the Pen GSAP ScrollTrigger start/end by Elen (@ambassador) on CodePen.

Несколько замечаний насчет значений параметров start и end:

  • Значения для start всегда отсчитываются относительно верхней границы анимируемого объекта (первое) и относительно верхнего края области просмотра. Если вы зададите, например, start: "20px 80%", то это будет означать, что анимация начнется, когда объект будет выше 80% вьюпорта на 20px.
  • Параметр end: "bottom 100px" означает, что нижний край анимируемого объекта должен достичь 100px от верхней границы браузера.
  • Для параметра end: '+=300' означает, что 300px будут отсчитаны относительно позиции start для анимируемого объекта.
  • Вы можете использовать функцию для задания параметров. Например, end: () => "+="+document.querySelector('.box').offsetWidth свяжет конец анимации с шириной объекта.
  • В плане исследования этих свойств еще важен html и css-код, т.к. viewport сильно зависит от того, что есть в вашей html-разметке и какие css-свойства заданы для элементов. Вы можете столкнуться с тем, что ничего не работает, т.к. параметры начала и конца анимации вошли в противоречие со стилями элементов и расположением этих элементов.

В примере используется параметр markers: true для понимания того, в каком месте начнется и закончится анимация. В этом случае отметки start и scroller-start будут зеленого цвета, а end и scroller-end - красного.

Если вам нужно изменить цвета маркеров или размер шрифта, например, из-за фона сайта, вы можете задать настройки этого параметра.

Еще один пример с маркерами.  Обратите внимание, что параметры начала и конца скроллинга имеют такие значения: start: "top 60%", end: "bottom 40%".

See the Pen GSAP Timeline markers Example by Elen (@ambassador) on CodePen.

Используем маркеры для отслеживания анимации

В примере ниже вы можете включать и выключать маркеры, чтобы увидеть, где начинается и заканчивается анимация, с одной стороны. А с другой, - где начинается и заканчивается прокрутка.

See the Pen GSAP ScrollTrigger Cards by HTML-plus (@ambassador) on CodePen.

Параметры scrub и pin

Параметр scrub может быть true | false или числом. Он связывает ход анимации непосредственно с полосой прокрутки, поэтому она действует как ползунок. Вы можете применить сглаживание, чтобы курсору воспроизведения потребовалось некоторое время, чтобы догнать положение полосы прокрутки! Это может быть любое из следующих

  • scrub: true - связывает ход анимации непосредственно с ходом ScrollTrigger.
  • scrub: число — количество времени (в секундах), которое должно пройти курсору воспроизведения, чтобы «догнать», поэтому scrub: 0.5 приведет к тому, что курсору воспроизведения анимации понадобится 0,5 секунды, чтобы догнать положение полосы прокрутки. Это отлично подходит для сглаживания ситуации.

Пример с перелистыванием страниц и использованием параметра scrub от Jhey.

See the Pen Little book of GSAP w/ ScrollTrigger by Jhey (@jh3y) on CodePen.

Параметр pin

Начнем, пожалуй, с примера.

See the Pen GSAP Bottom Pin Alternative - minimal by GreenSock (@GreenSock) on CodePen.

Параметр pin может быть true | false, cтрокой или элементом — это селектор элемента, который должен быть закреплен в то время, пока ScrollTrigger активен, то есть он будет «прилипать» к своему начальному положению, в то время как остальная часть содержимого продолжает прокручиваться под ним. Разрешен только один закрепленный элемент, но он может содержать столько элементов, сколько вы хотите. Установка pin: true приведет к закреплению триггерного элемента.

Пример анимации с pin: true

See the Pen GSAP ScrollTrigger - Pinned Section Animation by Ryan Mulligan (@hexagoncircle) on CodePen.

Предупреждение: не анимируйте сам закрепленный элемент, поскольку это приведет к сбою измерений (ScrollTrigger высоко оптимизирован для производительности и выполняет максимально возможный предварительный расчет). Вместо этого вы можете вкладывать вещи так, чтобы анимировать только элементы ВНУТРИ закрепленного элемента.

Примечание. Если вы закрепляете что-то, вложенное в другой элемент, который также закрепляется, убедитесь, что вы определили закрепленный контейнер, чтобы ScrollTrigger знал, что нужно соответствующим образом смещать начальную/конечную позиции.

В примере ниже используются параметры pin: true и scrub: 0.5 при перемещении блоков внутри одной секции.

See the Pen ScrollTrigger Flying Elements by GSAP (@GreenSock) on CodePen.

Пример с параметрами pin: true и scrub: true

See the Pen Scroll Trigger by GSAP (@GreenSock) on CodePen.

В примере ниже интересно то, что параметр end мы привязываем к расстоянию в 1000px.

See the Pen GSAP ScrollTrigger Cards start/end by Elen (@ambassador) on CodePen.

Использование pin для карточек

See the Pen GSAP ScrollTrigger Movie Stacking Animation by Zoe (@quicksilversel) on CodePen.

Pinned Object

Прикрепляем объект к определенному месту при прокрутке.

See the Pen GSAP Snap with Snap/Scrub by Naimesh B. (@naimeshbarot) on CodePen.

Пример использования ScrollTrigger со stagger для сетки из блоков

See the Pen GSAP ScrollTrigger Grid with Staggers by GSAP (@GreenSock) on CodePen.

Использование параметра stagger для анимации карточек

See the Pen Horizontal Scroll Cards by Ryan Mulligan (@hexagoncircle) on CodePen.

Пример с прокруткой части контента при закрепленном изображении

See the Pen Variable height stacked pinning with split scroll on section by GSAP (@GreenSock) on CodePen.

Параметр pinnedContainer

Здесь мы закрепляем определенный контейнер.

See the Pen GSAP ScrollTrigger scroll space by GSAP (@GreenSock) on CodePen.

Параметры onEnter, onLeave, onEnterBack и onLeaveBack

Параметры onEnter, onLeave, onEnterBack и onLeaveBack - это коллбек-функции (функции обратного вызова), которые отвечают за различные моменты "прохода скролла":

  • onEnter используется, когда позиция прокрутки перемещается вперед после «начала» (обычно, когда триггер прокручивается в поле зрения). Например:
  • onEnterBack используется, когда позиция прокрутки перемещается назад за «конец» (обычно, когда триггер прокручивается обратно в поле зрения). Например:
  • onLeave используется, когда позиция прокрутки перемещается вперед за «конец» (обычно, когда триггер прокручивается вне поля зрения). Например:
  • onLeaveBack  используется, когда позиция прокрутки перемещается назад за пределы «начала» (обычно, когда триггер прокручивается до конца назад после начала). Например:

По сути дела, это специальные события для плагина ScrollTrigger, которые позволяют реагировать с помощью функций-коллбеков на проход элементов в зоне видимости или скрытие из нее.

В примере ниже мы используем все параметры-события для того, чтобы либо добавить к карточкам (класс .card) класс .in-view с подсветкой в виде свойства box-shadow, либо удаляем этот класс, когда карточка выходит из зоны видимости.

See the Pen GSAP ScrollTrigger Cards events by HTML-plus (@ambassador) on CodePen.

Использование метода batch()

Метод ScrollTrigger.batch() в GSAP — это суперполезная функция, которая позволяет анимировать группу элементов, оптимизируя производительность и сокращая код.

Если говорить кратко, то метод batch() позволяет задать одно правило/анимацию для нескольких элементов, которые входят в зону видимости по отдельности или группами, не создавая отдельный ScrollTrigger для каждого элемента.

Когда использовать batch():

Когда… Почему batch() полезен
У тебя много одинаковых элементов (например, .card, .item, .box) Не нужно писать 100 ScrollTrigger'ов
Нужна реакция при входе/выходе элемента в зону видимости Удобно использовать onEnter, onLeave, onEnterBack, onLeaveBack
Важно улучшить производительность GSAP группирует вызовы

В примере у нас есть много блоков с однотипным форматированием и анимация с помощью метода batch().

See the Pen ScrollTrigger.batch() by HTML-plus (@ambassador) on CodePen.

Зачем использовать метод batch():

  • batch — это массив элементов, вошедших в зону действия (в отличие от onEnter: el => ..., где el — одиночный элемент).
  • GSAP оптимизирует события: если 5 .box одновременно попали в экран, ты получишь один вызов onEnter для всех 5.
  • Это сильно снижает нагрузку, особенно при большом числе элементов.
  • С stagger — получаем красивую последовательную анимацию.

Что еще можно сделать:

  • Можно использовать interval (по умолчанию 0.1 сек) — это как часто ScrollTrigger проверяет позицию скролла для batch.
  • Можно добавить once: true, если нужно анимировать один раз.
  • Можно использовать start, end как и в обычном ScrollTrigger.

А здесь метод batch() анимирует заголовки и абзацы.

See the Pen test scroll trigger cards batch by GSAP (@GreenSock) on CodePen.

В еще одном примере вы увидите, как карточки с фото помещаются в центре. Можно слегка изменить анимацию.

See the Pen ScrollTrigger.batch() by HTML-plus (@ambassador) on CodePen.

Однократное проигрывание анимации

Для однократного проигрывания анимации используйте параметр once: true.

Удаление свойств объекта после проигрывания анимации

Для удаления всех анимаций при скролле нужно использовать функцию kill(), "убивающую" настройки анимации плагина, а также сбрасывать параметры, которые вы могли устанавливать с помощью функций GSAP from() или to(), задавая свойство для элемента с виде { clearProps: "all" }. Кроме того, вам, возможно, придется удалять какие-то классы, как в примере с карточками.

И второй пример:

See the Pen GSAP example for inline-style-removal query by Elen (@ambassador) on CodePen.

Примеры использования плагина ScrollTrigger

Эффект параллакса при скроллинге

От создателей GreenSock

See the Pen Parallax sections on scroll by GreenSock (@GreenSock) on CodePen.

Похожий эффект для React от Phillip Gimmi

See the Pen React Smooth Section Navigator by Phillip Gimmi (@phillip-gimmi) on CodePen.

Автор Tom Miller 

See the Pen ScrollTrigger: SVG Text Mask by Tom Miller (@creativeocean) on CodePen.

Смена секций от Mahendra Pratap

See the Pen Gsap - ScrollTrigger, Section pin Animation by Mahendra Pratap (@mahendra_pratap) on CodePen.

Автор isladjan

See the Pen Parallax scroll animation by Elen (@ambassador) on CodePen.

ScrollTrigger + Draggable

See the Pen ScrollTrigger and Draggable by GreenSock (@GreenSock) on CodePen.

Использование SVG

В примере ниже при прокрутке мы видим, как SVG path с пунктирным контуром прорисовывается в процессе скролла при отслеживании этого с помощью GSAP ScrollTrigger.

See the Pen Scrolly Path with Cassie Evans! | @keyframers 4.1 by @keyframers (@keyframers) on CodePen.

Текстовый эффект от Pete Barr

See the Pen GSAP ScrollTrigger on Variable Fonts Perspective by Pete Barr (@petebarr) on CodePen.

Черно-белый текст от Craig Roblewsky

See the Pen Invert text on scroll with CSS variable by Craig Roblewsky (@PointC) on CodePen.

Появляющиеся буквы от Louis Hoebregts

See the Pen Apple Privacy animation - GSAP ScrollTrigger by Louis Hoebregts (@Mamboleoo) on CodePen.

Текстовый эффект для React от Phillip Gimmi

See the Pen Cinematic Text Reveal Scroll Animation by Phillip Gimmi (@phillip-gimmi) on CodePen.

Появление текста от Victor

See the Pen Text Color Change on Scroll (V2) by Victor (@vict0rkovalchuk) on CodePen.

И аналогичный пример от Prajot

See the Pen GSAP scrollTrigger opacity animation by Prajot (@prajotsurey) on CodePen.

Текстовый эффект с заголовками от Snorkl.tv

See the Pen splitText animation for each GSAP ScrollTrigger by Snorkl.tv (@snorkltv) on CodePen.

Вертикальный и горизонтальный скролл

Вариант для карточек с видео

See the Pen ScrollTrigger gallery by HTML-plus (@ambassador) on CodePen.

И еще один с фотогалереей от Luis Alberto Martinez Riancho

See the Pen ScrollSynced Carousel V3 (Gsap + Swiper) by Luis Alberto Martinez Riancho (@luis-lessrain) on CodePen.

Горизонтальный и вертикальный скролл + Swiper слайдер от Luis Alberto Martinez Riancho

See the Pen SieMatic Gsap + Swiper by Luis Alberto Martinez Riancho (@luis-lessrain) on CodePen.

Полукруглая галерея от MariaM

See the Pen Responsive GSAP ScrollTrigger Gallery by MariaM (@Marija-Milicevic) on CodePen.

Галерея от kamenono

See the Pen 3D Animation Scroll with GSAP ScrollTrigger by kamenono (@kamenono) on CodePen.

Горизонтальный скролл

Автор Snorkl.tv

See the Pen Pin / Horizontal Scroll // Fix Responsive by Snorkl.tv (@snorkltv) on CodePen.

Горизонтальный скролл для анимации природы от Abubaker Saeed

See the Pen Parallax Golden Hour Animation on Scroll (using GSAP &amp; ScrollTrigger) by Abubaker Saeed (@AbubakerSaeed) on CodePen.

Смена разделов при скролле от Phillip Gimmi

See the Pen Vertical Sectional Slider - React GSAP by Phillip Gimmi (@phillip-gimmi) on CodePen.

Пример горизонтального скролла с раскрывающейся панелью от GreenSock

See the Pen Horizontal Scroll with expandable section by GSAP (@GreenSock) on CodePen.

Анимация взлета самолета от Jordi Moreno

See the Pen Plane Taking Off. GSAP Ease + ScrollTrigger simple animation. by Jordi Moreno (@jomorespi) on CodePen.

Анимация появления деталей компьютера в виде SVG от Lucas Himes

See the Pen Computer Parts! by Lucas Himes (@notanotherdoornob) on CodePen.

Анимация появления из тени наушников от Alex Illarionov

See the Pen The Supersonic Plugin For Scroll Based Animation: GSAP Airpods by Alex Illarionov (@Alex-Illarionov) on CodePen.

Появление изображения из-под маски с помощью clip-path от Njo

See the Pen GSAP-Reveal-Scrolltrigger-Animation by Njo (@njonj0) on CodePen.

Аккордеон при прокрутке от Fabio Ottaviani

See the Pen Scrolltrigger accordion by Fabio Ottaviani (@supah) on CodePen.

Появление блоков при прокрутке от GSAP

See the Pen Start - Scroll Cards by GSAP (@GreenSock) on CodePen.

То ли слайдер, то ли страница сайта от Jhey 

See the Pen Humane.ai Inspired CSS Scroll Trickery ✨ by Jhey (@jh3y) on CodePen.

Сложный пример с отображением продукта в разных местах страницы

See the Pen GSAP | Animated Bottle Scroll by HTML-plus (@ambassador) on CodePen.

Страница с 3d мебелью на основе canvas от Paul Roger

See the Pen GSAP &amp; ScrollTrigger with Spline 3D by Paul Roger (@Tiopayo) on CodePen.

Страница сайта от Daniel Hult

See the Pen GSAP ScrollTrigger — UI Animations by Daniel Hult (@daniel-hult) on CodePen.

Страница сайта от Pete Barr

See the Pen GSAP ScrollTrigger parallaxing with ScrollSmoother by Pete Barr (@petebarr) on CodePen.

Автор: Админ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *