5 ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… способов Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React-прилоТСния Π² 2019 Π³ΠΎΠ΄Ρƒ

5 ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… способов Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React-прилоТСния Π² 2019 Π³ΠΎΠ΄Ρƒ

Анимация Π² прилоТСниях React β€” популярная ΠΈ обсуТдаСмая Ρ‚Π΅ΠΌΠ°. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ способов Π΅Π΅ создания ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ. НСкоторыС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ CSS, добавляя Ρ‚Π΅Π³ΠΈ Π² HTML-классы. ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ способ, Π΅Π³ΠΎ стоит ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ. Но, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со слоТными Π²ΠΈΠ΄Π°ΠΌΠΈ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ, стоит ΡƒΠ΄Π΅Π»ΠΈΡ‚ΡŒ врСмя ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ GreenSock, это популярная ΠΈ мощная ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°. Π’Π°ΠΊΠΆΠ΅ для создания Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ сущСствуСт масса Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π½ΠΈΡ….

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассматриваСтся ΠΏΡΡ‚ΡŒ способов анимирования React-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ:

  • CSS;
  • ReactTransitionGroup;
  • React-animations;
  • React-reveal;
  • TweenOne ΠΈ Ant Design.

Skillbox Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚: ΠžΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ½Π»Π°ΠΉΠ½-курс Β«ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΡ Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΒ».
НапоминаСм: для всСх Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Β«Π₯Π°Π±Ρ€Π°Β» β€” скидка 10 000 Ρ€ΡƒΠ±Π»Π΅ΠΉ ΠΏΡ€ΠΈ записи Π½Π° любой курс Skillbox ΠΏΠΎ ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄Ρƒ Β«Π₯Π°Π±Ρ€Β».

ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ доступны Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ (ΠΎΡ‚ΡΡŽΠ΄Π° Π² ΡΡ‚Π°Ρ‚ΡŒΡŽ вставлСны исходники вмСсто ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ, ΠΊΠ°ΠΊ Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅).

CSS

Как Ρ€Π°Π· ΠΎΠ± этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π² самом Π½Π°Ρ‡Π°Π»Π΅, ΠΈ ΠΎΠ½ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆ. Если вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ JavaScript, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, сборка Π±ΡƒΠ΄Π΅Ρ‚ нСбольшой, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρƒ Π½Π΅ потрСбуСтся ΠΌΠ½ΠΎΠ³ΠΎ рСсурсов. А это, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, влияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Если ваша анимация Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ простой, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π½Π° этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° β€” Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ мСню:

5 ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… способов Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React-прилоТСния Π² 2019 Π³ΠΎΠ΄Ρƒ

Оно ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ простоС, со свойством CSS ΠΈ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠΌ Ρ‚ΠΈΠΏΠ° className = Β«is-nav-openΒ» для Ρ‚Π΅Π³Π° HTML.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами. НапримСр, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Π΄ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠ΅ΠΉ wrapper, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ измСнСния ΠΏΠΎΠ»Π΅ΠΉ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ навигация ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡΡ‚ΠΎΡΠ½Π½ΡƒΡŽ ΡˆΠΈΡ€ΠΈΠ½Ρƒ, которая Ρ€Π°Π²Π½Π° 250px, ΡˆΠΈΡ€ΠΈΠ½Π° wrapper со свойством margin-left ΠΈΠ»ΠΈ translateX Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ ΡˆΠΈΡ€ΠΈΠ½Ρƒ. ΠŸΡ€ΠΈ нСобходимости ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΡŽ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ className = Β«is-nav-openΒ» для wrapper ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ wrapper Π½Π° margin-left / translateX: 0;.

Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ исходник Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

export default class ExampleCss extends Component {
    handleClick() {
        const wrapper = document.getElementById('wrapper');
        wrapper.classList.toggle('is-nav-open')
    }
    render() {
        return (
            <div id="wrapper" className="wrapper">
                <div className="nav">
                    <icon
                        className="nav__icon"
                        type="menu-fold"
                        onClick={() => this.handleClick()}/>
                    <div className="nav__body">
                        Lorem ipsum dolor sit amet, consectetur adipisicing elit.
                        Beatae ducimus est laudantium libero nam optio repellat
                        sit unde voluptatum?
                    </div>
                </div>
            </div>
        );
    }
}

А Π²ΠΎΡ‚ CSS-стили:

.wrapper {
    display: flex;
    width: 100%;
    height: 100%;
    transition: margin .5s;
    margin: 0 0 0 -250px;
}
 
.wrapper.is-nav-open {
    margin-left: 0;
}
 
.nav {
    position: relative;
    width: 250px;
    height: 20px;
    padding: 20px;
    border-right: 1px solid #ccc;
}
.nav__icon {
    position: absolute;
    top: 0;
    right: -60px;
    padding: 20px;
    font-size: 20px;
    cursor: pointer;
    transition: color .3s;
}
 
.nav__icon:hover {
    color: #5eb2ff;
}

ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡŽΡΡŒ, Ссли анимация ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ проста, Ρ‚ΠΎ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ β€” основной. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΠΎΡ€Π°Π΄ΡƒΠ΅Ρ‚ быстродСйствиС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°.

ReactTransitionGroup

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ReactTransitionGroup Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° сообщСства ReactJS. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ основныС CSS-Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹.

ReactTransitionGroup ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для измСнСния классов ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. Π£ Π½Π΅Π³ΠΎ нСбольшой Ρ€Π°Π·ΠΌΠ΅Ρ€, Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ для React-прилоТСния, Ρ‡Ρ‚ΠΎ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ сборки. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ CDN.

Π£ ReactTransitionGroup Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ элСмСнта, это Transition, CSSTransition ΠΈ TransitionGroup. Для запуска Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π² Π½ΠΈΡ… Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. Π‘Ρ‚ΠΈΠ»ΡŒ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² классах CSS.

Π’ΠΎΡ‚ анимация, Π° дальшС β€” способ Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

5 ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… способов Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React-прилоТСния Π² 2019 Π³ΠΎΠ΄Ρƒ

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ CSSTransitionGroup ΠΈΠ· react-transition-group. ПослС этого трСбуСтся ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ список ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ свойство transitionName. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ элСмСнта Π² CSSTransitionGroup ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ стили.

<CSSTransitionGroup
    transitionName="example">
    {items}
</CSSTransitionGroup>

ΠŸΡ€ΠΈ установкС свойства transitionName = Β«exampleΒ» классы Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… стилСй Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

.example-eneter {
    opacity: 0.01;
}
 
.example-enter.example-enter-active {
    opacity: 1;
    transition: opacity 300ms ease-in;
}
 
.example-leave {
    opacity: 1;
}
 
.example-leave.example-leave-active {
    opacity: 0.01;
    transition: opacity 300ms ease-in;

Π’Ρ‹ΡˆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ReactTransitionGroup.

НуТна Π΅Ρ‰Π΅ ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ°, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° добавлСния списка ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ΠΎΠ².

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ handleAdd β€” ΠΎΠ½ добавляСт Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρ‹, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ случайноС имя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² массив state.items.

Для удалСния ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π° ΠΏΠΎ индСксу Π² массивС state.items ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ handleRemove.

import React, { Component, Fragment } from 'react';
import { CSSTransitionGroup } from 'react-transition-group'
import random from 'random-name'
import Button from './button'
import Item from './item'
import './style.css';
export default class ReactTransitionGroup extends Component {
    
    constructor(props) {
        super(props);
        this.state = { items: ['Natividad Steen']};
        this.handleAdd = this.handleAdd.bind(this);
    }
 
    handleAdd() {
        let newItems = this.state.items;
        newItems.push(random());
        this.setState({ items: newItems });
    }
 
    render () {
        const items = this.state.items.map((item, i) => (
            <Item
            item={item}
            key={i}
            keyDelete={i}
            handleRemove={(i) => this.handleRemove(i)}
            />
        ));
 
    return (
        <Fragment>
            <Button onClick={this.handleAdd}/>
                <div className="project">
                    <CSSTransitionGroup
                    transitionName="example"
                    transitionEnterTimeout={500}
                    transitionLeaveTimeout={300}
                    >
                        {items}
                    </CSSTransitionGroup>
                </div>
        </Fragment>
    );
}
};

React-animations

React-animations прСдставляСт собой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, которая построСна Π½Π° animate.css. Π‘ Π½Π΅ΠΉ просто Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ρƒ Π½Π΅Π΅ мноТСство Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° совмСстима с любой inline-style-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ использованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для опрСдСлСния основных ΠΊΠ°Π΄Ρ€ΠΎΠ² Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Radium, Aphrodite ΠΈΠ»ΠΈ styled-components.

5 ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… способов Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React-прилоТСния Π² 2019 Π³ΠΎΠ΄Ρƒ

Π― знаю, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅:

5 ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… способов Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React-прилоТСния Π² 2019 Π³ΠΎΠ΄Ρƒ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ подпрыгивания.

5 ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… способов Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React-прилоТСния Π² 2019 Π³ΠΎΠ΄Ρƒ

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· react-animations.

const Bounce = styled.div`animation: 2s ${keyframes`${bounce}`} infinite`;

Π—Π°Ρ‚Π΅ΠΌ, послС создания ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ любой HTML-ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ.

<bounce><h1>Hello Animation Bounce</h1></bounce>

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

import React, { Component } from 'react';
import styled, { keyframes } from 'styled-components';
import { bounce } from 'react-animations';
import './style.css';
 
const Bounce = styled.div`animation: 2s ${keyframes`${bounce}`} infinite`;
 
export default class ReactAnimations extends Component {
    render() {
        return (
            <Bounce><h1>Hello Animation Bounce</h1></bounce>
        );
    }
}

ВсС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, анимация ΠΎΡ‡Π΅Π½ΡŒ простая. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для использования Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ подпрыгивания ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ΅ β€” react-animate-on-scroll.

React-reveal

Π’ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ΅ React Reveal Π΅ΡΡ‚ΡŒ основныС Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ постСпСнноС исчСзновСниС, ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Он Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со всСми анимациями ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ props. Π’Π°ΠΊ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ настройки, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ, расстояниС, каскад ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ CSS-эффСкты, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ сСрвСрный Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ высокого порядка. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½Π° анимация ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ, стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ.

import Fade from 'react-reveal/Fade';
 
<Fade top>
    <h1>Title</h1>
</Fade>

5 ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… способов Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React-прилоТСния Π² 2019 Π³ΠΎΠ΄Ρƒ

ВсСго Π΅ΡΡ‚ΡŒ ΠΏΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΎΠ², Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… полноэкранная страница ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ.

import React, { Component, Fragment } from 'react';
import Fade from 'react-reveal/Fade';
 
const animateList = [1, 2, 3, 4, 5];
 
export default class ReactReveal extends Component {
    render() {
        return (
            <Fragment>
                {animateList.map((item, key) => (
                    <div style={styles.block} key={key}>
                        <Fade top>
                            <h1 style={styles.title}>{`block ${item}`}</h1>                       
                        </Fade>
                    </div>
                ))}
            </Fragment>
        );
    }
}
 
const styles = {
    block: {
        display: 'flex',
        alignItems: 'center',
        justifyContent: 'center',
        width: '100%',
        height: '100%',
        background: '#000',
        borderBottom: '1px solid rgba(255,255,255,.2)',
    },
    title: {
        textAlign: 'center',
        fontSize: 100,
        color: '#fff',
        fontFamily: 'Lato, sans-serif',
        fontWeight: 100,
    },
};

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Π²ΠΎΠ΄ΠΈΠΌ константу animateList. Π’ массив Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΏΡΡ‚ΡŒ элСмСнтов. ПослС использования ΠΌΠ΅Ρ‚ΠΎΠ΄Π° массива map Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ΡŒ любой элСмСнт Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… Fade, вставляя элСмСнты Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ. Π‘Ρ‚ΠΈΠ»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² константС styles, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ CSS-стили ΠΊΠ°ΠΊ для Π±Π»ΠΎΠΊΠ°, Ρ‚Π°ΠΊ ΠΈ для Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°. Π’Ρ‹ΡˆΠ΅ β€” ΠΏΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΎΠ² с Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠ΅ΠΉ Fade.

TweenOne ΠΈ анимация Π² Ant Design

Ant Design β€” React UI-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая содСрТит большоС количСство ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΈ простых Π² использовании ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Она ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ элСгантныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ интСрфСйсы. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Π΅Π΅ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Alibaba, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π²ΠΎ мноТСствС своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

5 ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… способов Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React-прилоТСния Π² 2019 Π³ΠΎΠ΄Ρƒ

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ довольно ΠΌΠ½ΠΎΠ³ΠΎ Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Π£ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΈΠ· Π½ΠΈΡ… схоТая анимация, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‰Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅. Бюда Π²ΠΎΠΉΠ΄ΡƒΡ‚ лишь ΡˆΠ°Ρ€, Π·Π΅Π»Π΅Π½Ρ‹ΠΉ ΡˆΠ°Ρ€ΠΈΠΊ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, красный ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚.

5 ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… способов Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React-прилоТСния Π² 2019 Π³ΠΎΠ΄Ρƒ

Π’ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ использован ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TweenOne, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ΅Π½ PathPlugin, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ двиТСния. Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ всС это Π±ΡƒΠ΄Π΅Ρ‚ лишь Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ
PathPlugin Π² TweenOne.plugins.

TweenOne.plugins.push(PathPlugin);

ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

  • duration β€” врСмя Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π² мс;
  • ease β€” ΠΏΠ»Π°Π²Π½ΠΎΡΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ;
  • yoyo β€” ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ двиТСния Π²ΠΏΠ΅Ρ€Ρ‘Π΄ ΠΈ Π½Π°Π·Π°Π΄ с ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΈ;
  • repeat β€” ΠΏΠΎΠ²Ρ‚ΠΎΡ€ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. НуТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ -1 для бСсконСчной Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ;
  • p β€” ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΏΡƒΡ‚ΠΈ для Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ;
  • easePath β€” ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΏΠ»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ для Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ.

Π”Π²Π° послСдних ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° вСсьма спСцифичны, Π½ΠΎ ΠΎ Π½ΠΈΡ… Π½Π΅ стоит Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ, всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π½ΡƒΠΆΠ½ΠΎ.

const duration = 7000;
const ease = 'easeInOutSine';
const p =
  'M123.5,89.5 C148,82.5 239.5,48.5 230,17.5 C220.5,-13.5 127,6 99.5,13.5 C72,21 -9.5,56.5 1.5,84.5 C12.5,112.5 99,96.5 123.5,89.5 Z';
const easePath =
  'M0,100 C7.33333333,89 14.3333333,81.6666667 21,78 C25.3601456,75.6019199 29.8706084,72.9026327 33,70 C37.0478723,66.2454406 39.3980801,62.0758689 42.5,57 C48,46.5 61.5,32.5 70,28 C77.5,23.5 81.5,20 86.5,16 C89.8333333,13.3333333 94.3333333,8 100,0';
const loop = {
  yoyo: true,
  repeat: -1,
  duration,
  ease,
};

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ созданию ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ.

  • redSquare содСрТит ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ†ΠΈΠΊΠ»Π° плюс ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ Y, Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ.
  • greenBall содСрТит ΠΏΡƒΡ‚ΡŒ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° x, Ρƒ β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ p. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΏΠΎΠ²Ρ‚ΠΎΡ€ ΠΈ ΠΏΠ»Π°Π²Π½ΠΎΡΡ‚ΡŒ β€” функция TweenOne.easing.path, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.
  • path β€” easePath.
  • lengthPixel β€” кривая, которая Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° всСго Π½Π° 400 сСкций.
  • track β€” ΠΎΠ²Π°Π» с осями, Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ стили Ρ†ΠΈΠΊΠ»Π° ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π°.

const animate = {
  redSquare: {
    ...loop,
    y: 15,
    duration: 3000,
    delay: 200,
  },
  greenBall: {
    path: { x: p, y: p },
    duration: 5000,
    repeat: -1,
    ease: TweenOne.easing.path(easePath, { lengthPixel: 400 }),
  },
  track: {
    ...loop,
    rotate: 15,
  },
};

Π’Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TweenOne. ВсС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈΠ· rc-tween-one. TweenOne β€” Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ ΠΆΠ΅ proprs ΠΈ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ props, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ TweenOne β€” собствСнныС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ redSquare, track, greenBall.

import React from 'react';
import TweenOne from 'rc-tween-one';
 
export default function BannerImage() {
    return (
      <div className="wrapper-ant-design">
        <svg width="482px" height="500px" viewBox="0 0 482 500">
          <defs>
            <path
              d="M151,55 C129.666667,62.6666667 116,74.3333333 110,90 C104,105.666667 103,118.5 107,128.5 L225.5,96 C219.833333,79 209.666667,67 195,60 C180.333333,53 165.666667,51.3333333 151,55 L137,0 L306.5,6.5 L306.5,156 L227,187.5 L61.5,191 C4.5,175 -12.6666667,147.833333 10,109.5 C32.6666667,71.1666667 75,34.6666667 137,0 L151,55 Z"
              id="mask"
            />
          </defs>
          <g stroke="none" strokeWidth="1" fill="none" fillRule="evenodd" transform="translate(0, 30)">
            <g id="Group-13" transform="translate(0.000000, 41.000000)">
              <TweenOne component="g" animation={animate.redSquare}>
                <rect
                  stroke="#F5222D"
                  strokeWidth="1.6"
                  transform="translate(184.000000, 18.000000) rotate(8.000000) translate(-184.000000, -18.000000) "
                  x="176.8"
                  y="150.8"
                  width="14.4"
                  height="14.4"
                  rx="3.6"
                />
              </TweenOne>
            </g>
            <g id="Group-14" transform="translate(150.000000, 230.000000)">
              <g id="Group-22" transform="translate(62.000000, 7.000000)">
                <image
                  id="cc4"
                  alt="globe"
                  xlinkHref="https://gw.alipayobjects.com/zos/rmsportal/FpKOqFadwoFFIZFExjaf.png"
                  width="151px"
                  height="234px"
                />
              </g>
              <mask id="mask-2">
                <use xlinkHref="#mask" fill="white" transform="translate(-42, -33)" />
              </mask>
              <g mask="url(#mask-2)">
                <TweenOne component="g" animation={animate.track} style={{ transformOrigin: '122.7px 58px' }}>
                  <g transform="translate(-16, -52)">
                    <g transform="translate(16, 52)">
                      <path
                        d="M83.1700911,35.9320015 C63.5256194,37.9279025 44.419492,43.1766434 25.8517088,51.6782243 C14.3939956,57.7126276 7.77167019,64.8449292 7.77167019,72.4866248 C7.77167019,94.1920145 61.1993389,111.787709 127.105708,111.787709 C193.012078,111.787709 246.439746,94.1920145 246.439746,72.4866248 C246.439746,55.2822262 212.872939,40.6598106 166.13127,35.3351955"
                        id="line-s"
                        stroke="#0D1A26"
                        strokeWidth="1.35"
                        strokeLinecap="round"
                        transform="translate(127.105708, 73.561453) rotate(-16.000000) translate(-127.105708, -73.561453) "
                      />
                    </g>
                    <TweenOne component="g" animation={animate.greenBall}>
                      <image
                        alt="globe"
                        id="id2"
                        xlinkHref="https://gw.alipayobjects.com/zos/rmsportal/IauKICnGjGnotJBEyCRK.png"
                        x="16"
                        y="62"
                        width="26px"
                        height="26px"
                      />
                    </TweenOne>
                  </g>
                </TweenOne>
              </g>
            </g>
          </g>
        </svg>
      </div>
    );
  }

5 ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… способов Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ React-прилоТСния Π² 2019 Π³ΠΎΠ΄Ρƒ

Π”Π°, выглядит ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ²Π°Ρ‚ΠΎ, Π½ΠΎ анимация с использованиСм этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° проста.

 <TweenOne component="g" animation={animate.redSquare} />
  <TweenOne component="g" animation={animate.track} />
  <TweenOne component="g" animation={animate.greenBall} />

ВрСбуСтся всСго лишь ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΈ пСрСнСсти ΠΈΡ… Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TweenOne.

Для достиТСния Ρ€Π°Π·Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ Π½ΡƒΠΆΠ½Ρ‹ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±Ρ‹Π»ΠΈ рассмотрСны нСсколько Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² большом количСствС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’Π°ΡˆΠ΅ Π΄Π΅Π»ΠΎ β€” Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ подходящСС.

Skillbox Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com