Примеры анимаций, управляемых прокруткой

Света Гопалакришнан
Swetha Gopalakrishnan
Саурабх Раджпал
Saurabh Rajpal

Анимация, управляемая прокруткой, — распространённый шаблон UX в веб-разработке. Анимация, управляемая прокруткой, связана с положением прокрутки контейнера. Это означает, что при прокрутке вверх или вниз связанная анимация перемещается вперёд или назад в ответ на это. Примерами таких эффектов являются параллаксные фоновые изображения или индикаторы чтения, которые перемещаются при прокрутке.

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

Однако, благодаря новым функциям CSS и пользовательского интерфейса, появившимся в браузерах , теперь можно создавать декларативные анимации, управляемые прокруткой. С помощью Scroll Timelines и View Timelines — новых концепций, интегрирующихся с существующими API веб-анимаций (WAAPI) и CSS Animations API , — теперь можно создавать плавные анимации, управляемые прокруткой, работающие вне основного потока, всего несколькими строками кода. В этом примере вы узнаете, как Tokopedia, redBus и Policybazaar уже извлекают выгоду из этой новой функции.

Browser Support

  • Chrome: 115.
  • Edge: 115.
  • Firefox Technology Preview: поддерживается.
  • Сафари: 26.

Source

Токопедия

Tokopedia заменила свои предыдущие пользовательские реализации JavaScript на анимацию, управляемую прокруткой, чтобы оптимизировать производительность страниц и улучшить общее впечатление от просмотра на всех этапах воронки конверсии в электронной коммерции.

Нам удалось сократить количество строк кода до 80% по сравнению с использованием традиционных событий прокрутки JavaScript, и мы заметили, что средняя загрузка ЦП во время прокрутки снизилась с 50% до 2% — Энди Вихалим , старший инженер-программист, Tokopedia.

Анимированное изменение видимости верхней фиксированной панели в зависимости от положения прокрутки пользователем.

Код

В приведенной ниже реализации используется функция scroll() для установки анонимной временной шкалы прогресса прокрутки , управляющей ходом CSS-анимации. Видимость верхней фиксированной панели изменяется в зависимости от положения прокрутки в пределах определенного диапазона animationRange .

const toggleBar = keyframes({
  to: { height: 48 },
});

export const cssWrapper = css({
  position: 'fixed',
  left: 0,
  width: '100vw',
  pointerEvents: 'none',
  marginTop: 120,
  height: 0,
  overflow: 'hidden',
  display: 'flex',
  flexDirection: 'column',
  justifyContent: 'flex-end',
  animation: `${toggleBar} linear both`,
  animationTimeline: 'scroll()',
  animationRange: '20px 70px',
});

красный автобус

На целевой странице сайта redBus, посвященной различным мероприятиям, которая отображается всем пользователям на ранних этапах воронки продаж, используются разные анимации для мобильных и десктопных устройств. Благодаря анимации, управляемой прокруткой, им удалось заменить пользовательские реализации JavaScript на CSS для достижения того же эффекта.

Варианты использования

Фотогалерея с функцией отображения изображений (для мобильных устройств) и функцией Cover Flow (для настольных компьютеров).

Эффект анимационного появления изображений при прокрутке для загрузки изображений в фотогалерее redBus "Чем заняться".

Код (мобильный)

В предыдущем примере Tokopedia использовала анонимную временную шкалу прогресса прокрутки . В следующем коде redBus использует именованную временную шкалу прогресса представления . Анимация изменяет opacity и clip-path элемента <img> в пределах определенного animation-range внутри ближайшего к элементу родительского скроллера, которым в данном случае является скроллер фотогалереи.

const reveal = keyframes`
   from {
       opacity: 0;
       clip-path: inset(45% 20% 45% 20%);
   }
   to {
       opacity: 1;
       clip-path: inset(0% 0% 0% 0%);
   }`

const CardImage = styled.div`
   width: 100%;
   height: 100%;
   img {
       border-top-left-radius: 0.75rem;
       border-top-right-radius: 0.75rem;
       height: 100%;
       width: 100%;
       object-fit: cover;
       view-timeline-name: --revealing-image;
       view-timeline-axis: block;
  
       /* Attach animation, linked to the  View Timeline */
       animation: linear ${reveal} both;
       animation-timeline: --revealing-image;
  
       /* Tweak range when effect should run*/
       animation-range: entry 25% cover 50%;
   }
`;

Мы очень рады появлению этой функции, поскольку она идеально сочетает в себе повышение производительности и улучшение пользовательского опыта, усиливая сигналы Page Experience для SEO. Кроме того, минимальная кривая обучения делает её незаменимой для каждого интернет-магазина. Мы также получили положительные отзывы и поддержку от других команд в использовании SDA для расширения пользовательских сценариев . — Амит Кумар , старший инженер-менеджер, redBus .

Полибазар

Сравнение страховых планов — это часто повторяющееся ключевое действие, которое пользователи совершают в процессе принятия решения. Используя анимацию, управляемую прокруткой, Policybazaar уменьшал размер элементов с низким приоритетом в ответ на прокрутку пользователем таблицы. Это обеспечило плавную прокрутку и улучшило читаемость.

Благодаря анимации, управляемой прокруткой, мы смогли максимально увеличить пространство в области просмотра, чтобы пользователь мог сравнивать планы, обеспечивая сосредоточенное и не перегруженное информацией чтение . — Ришаб Мехротра , руководитель отдела дизайна подразделения страхования жизни, PolicyBazaar .

Анимация, управляемая прокруткой animate-timeline в таблице сравнения планов в подразделении «Инвестиции и страхование жизни» (направление деятельности).

Код

Аналогично предыдущему примеру от Tokopedia, Policybazaar использует функцию scroll() для установки анонимной временной шкалы прогресса прокрутки , управляющей ходом CSS-анимации. В данном случае происходит уменьшение размера шрифта и затухание заголовка в зависимости от положения прокрутки в пределах заданного animation-range .

@supports (animation-timeline: scroll()) {
.plan-comparison .inner-header {
animation: move-and-fade-header linear both;
}
.plan-comparison .left-side {
animation: shrink-name linear both;
}
.plan-comparison .inner-header, .plan-comparison .left-side {
animation-timeline: scroll();
animation-range: 0 150px;
}
}

@keyframes move-and-fade-header {
  to {
    translate: 0% -5%;
    top:103px;
}
}

@keyframes shrink-name {
  to {
    font-size: 1.5rem;
  }
}

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

Все представленные компании электронной коммерции использовали анимацию, управляемую прокруткой, на страницах с карточками, привлекая к ним внимание пользователя. Следующие примеры демонстрируют эффекты прокрутки на карточках на разных этапах пользовательского пути. Обычно это достигается с помощью анонимной временной шкалы прогресса представления для управления ходом пользовательской CSS-анимации, как показано в следующем фрагменте CSS.

@keyframes animate-in {
 0% { opacity: 0; transform: translateY(10%); }
 100% { opacity: 1; transform: translateY(0); }
}

@keyframes animate-out {
 0% { opacity: 1; transform: translateY(0); }
 100% { opacity: 0; transform: translateY(-10%); }
}

.flyin_animate {
   animation: animate-in linear forwards;
   animation-timeline: view();
   animation-range: entry;
}

redBus (Главная страница)

Эффект всплывающей анимации, управляемый прокруткой, для загрузки карточек товаров на целевой странице redBus "Чем заняться".

Policybazaar (Страница со списком товаров)

Анимация, управляемая прокруткой, для плавного появления и исчезновения карточек продуктов в направлениях «Инвестиции» и «Страхование жизни».

Токопедия (страница с подробным описанием товара)

Анимация плавного появления и исчезновения при прокрутке списка товаров.

Что следует учитывать при использовании API для анимации, управляемой прокруткой

Можно реализовать полифил для анимаций, управляемых прокруткой, в браузерах, не поддерживающих эту функцию, например, с помощью полифила Scroll-timeline . В этом случае потребуется дополнительное тестирование, чтобы убедиться в его корректной работе с вашим фреймворком и в том, что браузеры, использующие полифил, не будут сталкиваться с ошибками анимации или некорректной работой.

В CSS можно использовать @supports для проверки поддержки `animation-timeline` перед использованием анимаций, управляемых прокруткой. Например:

@supports (animation-timeline: scroll()) {

}

Ресурсы

Ознакомьтесь с другими статьями этой серии, в которых рассказывается о том, как компании электронной коммерции извлекли выгоду из использования новых функций CSS и пользовательского интерфейса, таких как переходы между представлениями, всплывающие окна, запросы контейнеров и селектор has() .