Анимация

1. Ванильный CSS

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

Использование CSS для скрытия элементов противоречит идеологии React, разметка остается в DOM-дереве, и практически невозможно нормально сделать анимацию исчезновения. Анимация добавления и удаления элементов коллекции излишне сложная.

2. React Transition Group

Эта библиотека не анимирует стили самостоятельно. Вместо этого, разработчику предоставляется набор простых компонентов, которые отслеживают этапы перехода состояния элемента (добавления и удаления в DOM) и управляют CSS-стилями, тем самым позволяя применить определенный CSS на каждом этапе.

npm install react-transition-group

React Transition Grouparrow-up-right

2.1. Компонент Transition

Компонент на базе которого построены остальные. Позволяет описывать переход компонента от одного состояния к другому с течением времени. По умолчанию компонент <Transition> не изменяет поведение компонента, который он отображает, а только отслеживает состояния enter и exit. Разработчик может сделать кастомные эффекты (например, добавляя инлайн стили или классы) под эти состояния.

Существует 4 основных состояния, в которых может быть элемент:

  • entering - элемент появляется в DOM

  • entered - элемент появился в DOM

  • exiting - элемент удаляется из DOM

  • exited - элемент удален из DOM

Пропы:

  • in - буль, сигнализирует о начале стадии появления или удаления элемента.

  • timeout - время перехода, кол-во миллисекунд которое будет использовано для всех стадий, либо объект с полями под стадии enter и exit.

  • unmountOnExit - отвечает за удаление элемента из DOM-дерева после фазы exit.

Если значение пропа in равно true, компонент начинает стадию входа. Он переходит из текущего состояния к entering и останавливается в нем на указанное в timeout время, по истечении которого переходит в entered.

Если значение пропа in равно false, компонент начинает стадию Выхода. Он переходит из текущего состояния к exiting и останавливается в нем на указанное в timeout время, по истечении которого переходит в exited.

2.2. Компонент CSSTransition

Компонент <CSSTransition>, в отличии от <Transition>, инкапсулирует отслеживание стадии перехода и вызывает перекомпоновку (reflow) в браузере, что позволяет без дополнительных усилия реализовать анимацию добавления элемента. Получает те же самые пропы in, timeout и другие, а также проп classNames, в котором можно указать кастомные имена классов для каждой фазы перехода.

Применяет пару CSS-классов для каждой из стадий appear, enter, exit и done во время перехода. На старте каждой фазы применяется базовый класс, после чего сразу применяется класс с приставкой active. Разработчику достаточно передать имя базового класса и описать классы для каждой из стадий.

К примеру если базовый класс fade:

Пропу classNames можно передать объект с кастомными именами классов под каждую стадию.

Если используются CSS-модули, то имена классов можно назвать как имена ключей на объекте для classNames и передать объект классов целиком.

2.3. Transition events

Всего 6 штук, происходят в указанном порядке. Используются для управления сложными анимациями и выполнения кода на определенной стадии.

2.4. Компонент TransitionGroup

Компонент <TransitionGroup> используется как контейнер для управления коллекцией компонентов <Transition> или <CSSTransition>. При удалении и добавлении элементов коллекции, <TransitionGroup> автоматически указывает значение пропа in добавляемого или удаляемого элемента.

Принимает проп component, в котором можно указать тип HTML-элемента который необходимо отрендерить как контейнер, по умолчанию будет div. Для передачи стилей есть проп className, значение которого передается элементу.

2.5. Анимация маршрутов

2.6. Дополнительные материалы

Last updated