0Pricing
React Academy · Урок

Анимированные компоненты и интерполяция стилей

Применяйте значения пружины к animated.div и другим элементам, а также интерполируйте значения для сложных вычислений стилей

«Анимированные компоненты и интерполяция стилей» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Замены HTML-элементов с помощью animated.*

react-spring предоставляет анимированные версии всех элементов HTML: animated.div, animated.span, animated.img, animated.button и т. д. Это прямые замены обычных аналогов с одним важным отличием: они могут принимать объекты SpringValue в свойствах стиля.

Почему только animated.* могут использовать пружины

Обычные элементы React получают стиль в виде простого объекта со статическими значениями. SpringValues — это специальные объекты, которые обновляются на каждом кадре анимации, не проходя через цикл повторной отрисовки React. Только компоненты animated.* умеют подписываться на обновления SpringValue и напрямую изменять стиль DOM, полностью обходя React ради максимальной производительности.

Базовое применение стилей пружины

Применяйте значения пружины непосредственно как свойства стиля CSS у анимированных компонентов. Например: style={{ opacity: opacity, transform: transform }}, где opacity и transform — это SpringValues, возвращённые useSpring. animated.div считывает эти значения на каждом шаге RAF (requestAnimationFrame) и применяет их к узлу DOM.

Метод интерполяции .to()

У SpringValues есть метод .to() для преобразования результата. Распространённый вариант использования — преобразовать числовое значение пружины в строку CSS: x.to(v => "translateX(" + v + "px)"). Функция получает текущее числовое значение и возвращает преобразованный результат, который применяется как стиль.

Интерполяция между диапазонами

Метод .to() также принимает входные массивы для отображения диапазонов: x.to([0, 1], ["#ff0000", "#00ff00"]) преобразует значение пружины из диапазона [0, 1] в диапазон цветов от красного к зелёному. Так числовые значения пружины преобразуют в цвета, строки или любые значения, которые нельзя представить обычным числом.

Интерполяция преобразования нескольких значений

Если пружина одновременно отслеживает несколько значений, их можно интерполировать вместе. Для пружины, отслеживающей { x, y }, можно написать: x.to((xVal, yVal) => "translate(" + xVal + "px," + yVal + "px)"). Обратный вызов .to() получает все значения в том порядке, в котором они указаны в конфигурации пружины.

Создание анимированных пользовательских компонентов

Вы можете обернуть собственные компоненты с помощью animated(): const AnimatedCard = animated(Card). Обёрнутый компонент должен принимать свойство style и передавать его элементу DOM. Теперь AnimatedCard может получать SpringValues в свойстве стиля так же, как animated.div.

Объединение нескольких пружин

Сложные анимации часто объединяют несколько пружин. Например, в анимации появления одна пружина может отвечать за непрозрачность, а другая — за вертикальное положение. Применить обе к одному animated.div можно так: style={{ opacity: opacitySpring.opacity, transform: positionSpring.y.to(y => "translateY(" + y + "px)") }}.

Производительность: обход повторной отрисовки React

Важнейшая особенность react-spring с точки зрения производительности заключается в том, что обновления анимированных значений обходят механизм согласования React. Пока пружина анимируется, React НЕ выполняет повторную отрисовку компонента на каждом кадре. Вместо этого компонент animated.* напрямую обновляет свойство стиля узла DOM в каждом обратном вызове requestAnimationFrame, благодаря чему возможна анимация с частотой 60 кадров в секунду без дополнительных затрат React.

Интерполяция непрозрачности и масштаба

Распространённые варианты анимации с интерполяцией: плавное появление при монтировании с помощью opacity.to([0, 1], [0, 1]), увеличение масштаба при наведении с помощью scale.to(s => "scale(" + s + ")") и поворот при переключении с помощью rotation.to(r => "rotate(" + r + "deg)"). Объединение этих преобразований создаёт составные эффекты.

Ограничение и экстраполяция

По умолчанию .to() с массивами диапазонов может продолжать вычисления за пределами заданного диапазона. Управлять этим можно с помощью параметра экстраполяции: x.to({ range: [0, 1], output: [0, 100], extrapolate: "clamp" }) не позволяет результату опуститься ниже 0 или подняться выше 100, даже если пружина выходит за границы. Это полезно для индикаторов выполнения и ограниченных анимаций.

Требование к компоненту animated.*

Почему при применении значений пружины необходимо использовать animated.div, а не обычный div?

Итоги урока: анимированные компоненты

animated.div, animated.span и animated(CustomComponent) — это готовые замены, принимающие SpringValues в свойствах стиля. Метод .to() интерполирует значения пружины: преобразует их в строки CSS, диапазоны цветов или любой другой формат результата. Несколько пружин естественным образом объединяются в одном элементе. Главное преимущество с точки зрения производительности: обновления пружин обходят повторную отрисовку React, напрямую изменяя стили DOM в обратных вызовах RAF.

Часто задаваемые вопросы

Урок «Анимированные компоненты и интерполяция стилей» бесплатный?

Да — полный текст урока «Анимированные компоненты и интерполяция стилей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Анимированные компоненты и интерполяция стилей»?

Применяйте значения пружины к animated.div и другим элементам, а также интерполируйте значения для сложных вычислений стилей Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Анимированные компоненты и интерполяция стилей»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы React Spring: хук useSpring
  2. Анимированные компоненты и интерполяция стилей
  3. useTrail и useChain для последовательностей
  4. Анимации на основе жестов с use-gesture
← Назад к React Academy