
Animation in React application ke sehlooho se tsebahalang le seo ho buisanoang ka sona. 'Nete ke hore ho na le mekhoa e mengata ea ho e etsa. Bahlahisi ba bang ba sebelisa CSS ka ho kenya li-tag ho lihlopha tsa HTML. Mokhoa o motle, o lokelang ho sebelisoa. Empa haeba u batla ho sebetsa le mefuta e rarahaneng ea lipopae, ho bohlokoa ho ipha nako ea ho ithuta GreenSock, ke sethala se tsebahalang ebile se matla. Hape ho na le lilaebrari tse ngata le likarolo tsa ho etsa lipopae. A re bue ka tsona.
Sengoliloeng sena se bua ka mekhoa e mehlano ea ho phelisa lits'ebetso tsa React:
- CSS;
- ReactTransitionGroup;
- React-animation;
- React-hlahisa;
- Moralo oa TweenOne le Ant.
Skillbox e khothaletsa: Lithuto tsa inthaneteng .
Re hopotsa: bakeng sa babali bohle ba "Habr" - theolelo ea li-ruble tse 10 ha u ngolisa thupelong efe kapa efe ea Skillbox u sebelisa khoutu ea papatso ea "Habr".
Mehlala eohle e fumaneha ho (ho tloha mona mehloli e kenngoa sehloohong ho e-na le litšoantšo, joalo ka sehloohong sa pele).
CSS
Mokhoa ona ho ile ha buisanoa ka oona qalong, ’me o hlile o molemo. Haeba, sebakeng sa ho kenya lilaebrari tsa JavaScript, u e sebelisa, kopano e nyane, sebatli ha se hloke lisebelisoa tse ngata. 'Me sena, ehlile, se ama ts'ebetso ea kopo. Haeba animation ea hau e hloka ho ba bonolo, nahana ka mokhoa ona.
Ka mohlala, mona ke menu ea animated:

E batla e le bonolo, e na le thepa ea CSS le trigger e kang className="is-nav-open" ho tag ea HTML.
Mokhoa ona o ka sebelisoa ka litsela tse fapaneng. Ka mohlala, etsa sekoahelo ka holim'a navigation ebe u etsa hore sebaka se fetohe. Kaha ho tsamaea ho na le bophara bo sa fetoheng ba 250px, bophara ba sephutheloana se nang le thepa ea margin-left kapa translateX bo lokela ho ba le bophara bo lekanang. Haeba o hloka ho bonts'a navigation eo u e hlokang ho kenya className = "is-nav-open" ho sephutheloana ebe u isa sephutheloana ho margin-left / translateX: 0;.
Qetellong, mohloli oa animation o tla shebahala tjena:
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>
);
}
}Mona ke mekhoa ea 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;
}Hape, haeba animation e batla e le bonolo, joale mokhoa ona ke oona o ka sehloohong. Basebelisi ba tla thabela lebelo la sebatli.
ReactTransitionGroup
Karolo ea ReactTransitionGroup e entsoe ke sehlopha sa sechaba sa ReactJS. Ka thuso ea eona, o ka kenya tšebetsong litšoantšo le liphetoho tsa CSS habonolo.
ReactTransitionGroup e etselitsoe ho fetola litlelase ha bophelo ba karolo bo fetoha. E nyane ka boholo mme e hloka ho kengoa ka har'a sephutheloana sa kopo ea React, e tla eketsa hanyane boholo ba kakaretso ea kaho. Ho feta moo, o ka sebelisa CDN.
ReactTransitionGroup e na le likarolo tse tharo, Transition, CSSTransition le TransitionGroup. Ho qala animation, o hloka ho phuthela karolo ho tsona. Setaele le sona se hloka ho ngoloa ka litlelase tsa CSS.
Mona ke animation, 'me joale - tsela ea ho e kenya ts'ebetsong.

Mohato oa pele ke ho kenya CSSTransitionGroup ho tsoa ho react-transition-group. Kamora sena, o hloka ho phuthela lenane ebe o seta thepa ea transitionName. Nako le nako ha karolo ea ngoana ho CSSTransitionGroup e eketsoa kapa e tlosoa, e fumana mekhoa ea lipopae.
<CSSTransitionGroup
transitionName="example">
{items}
</CSSTransitionGroup>Ka ho seta thepa ea transitionName = "mohlala", litlelase tsa maqephe a setaele li tlameha ho qala ka lebitso la mohlala.
.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;Ka holimo ke mohlala oa ho sebelisa ReactTransitionGroup.
Re boetse re hloka logic, le mekhoa e 'meli ea ho kenya ts'ebetsong mohlala oa ho eketsa lenane la mabitso.
Mokhoa oa pele ke handleAdd - e eketsa mabitso a macha, e fumana lebitso le sa lebelloang, leo e le behang ka har'a state.items array.
Ho tlosa lebitso ka index ho state.items array, handleTlosa e sebelisoa.
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-animation
ke laebrari e hahiloeng holim'a animate.css. Ho bonolo ho sebetsa le eena mme o na le likoleke tse ngata tse fapaneng tsa lipopae. Laeborari e tsamaellana le laeborari efe kapa efe ea setaele sa inline e tšehetsang ts'ebeliso ea lintho ho hlalosa liforeimi tsa mantlha tsa animation, ho kenyeletsoa Radium, Aphrodite kapa likarolo tsa setaele.

Ke tseba seo u se nahanang:

Joale a re hlahlobeng hore na sena se sebetsa joang re sebelisa mohlala oa animation ea bouncing.

Pele ho tsohle, re kenya animation ho tsoa ho react-animation.
const Bounce = styled.div`animation: 2s ${keyframes`${bounce}`} infinite`;
Joale, ka mor'a ho theha karolo, re thatela khoutu efe kapa efe ea HTML kapa karolo bakeng sa animation.
<bounce><h1>Hello Animation Bounce</h1></bounce>Mohlala:
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>
);
}
}Ntho e 'ngoe le e' ngoe e sebetsa, animation e bonolo haholo. Ntle le moo, ho na le tharollo e ntle ea ho sebelisa animation ea ho phunya - .
Hlahisa-hlahisa
Ho na le lipopae tsa mantlha tse kenyelletsang ho fifala, ho phethola, ho phahamisa, ho potoloha le tse ling. E u lumella ho sebetsa le lipopae tsohle u sebelisa lisebelisoa. Kahoo, o ka beha litlhophiso tse ling, ho kenyelletsa boemo, ho lieha, sebaka, cascade le tse ling. Liphello tse ling tsa CSS li ka sebelisoa, ho kenyelletsa phepelo ea lehlakore la seva le likarolo tse phahameng. Ka kakaretso, haeba o hloka animation ea ho tsamaisetsa, moralo ona o loketse ho sebelisoa.
import Fade from 'react-reveal/Fade';
<Fade top>
<h1>Title</h1>
</Fade> 
Ho na le li-blocks tse hlano ka kakaretso, e 'ngoe le e' ngoe ea tsona e na le leqephe le sehlooho se tletseng skrine.
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,
},
};Hona joale re hlahisa animateList constant. Sehlopha se na le lintlha tse hlano. Ka mor'a ho sebelisa mokhoa oa 'mapa, hoa khoneha ho fana ka ntho leha e le efe likarolong tsa Fade ka ho kenya likarolo hloohong. Litaele tse hlalosoang ka mokhoa oa kamehla li fumana mekhoa e khuts'oane ea CSS bakeng sa boloko le hlooho. Ka holimo ke li-blocks tse hlano tse nang le animation ea Fade.
TweenOne le animation ho Ant Design
- Laeborari ea React UI, e nang le likarolo tse ngata tsa bohlokoa le tse bonolo ho li sebelisa. E loketse haeba o hloka ho theha li-interfaces tse ntle tsa mosebelisi. E entsoe ke Alibaba, e sebelisang laebrari mererong ea eona e mengata.

Mohlala o na le likarolo tse ngata tsa animated. Boholo ba bona ba na le litšoantšo tse tšoanang, kahoo ts'ebetsong ea mohlala e tla ba bonolo ho feta e ka holimo. Sena se tla kenyelletsa bolo feela, bolo e tala le ntho e eketsehileng, mohlala, lisekoere tse khubelu.

Papali e sebelisa karolo ea TweenOne, e hlokang PathPlugin ho hlophisa tsela ea motsamao ka nepo. Sena sohle se tla sebetsa ha feela o ka beha
PathPlugin ho TweenOne.plugins.
TweenOne.plugins.push(PathPlugin);Li-parameter tse kholo tsa animation ke tse latelang:
- nako - nako ea animation ho ms;
- bonolo - animation boreleli;
- yoyo - ho fetola motsamao pele le morao ka ho pheta-pheta ka 'ngoe;
- pheta - pheta animation. Ho hlokahala ho sebelisa -1 bakeng sa animation e sa feleng;
- p - lihokahanyo tsa tsela bakeng sa animation;
- easePath - likhokahano tsa tsela e boreleli bakeng sa animation.
Mekhahlelo e 'meli ea ho qetela e totobetse haholo, empa ha ho hlokahale hore u tšoenyehe ka eona, ntho e' ngoe le e 'ngoe e sebetsa kamoo e lokelang.
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,
};Joale o ka qala ho theha ntho ea animation.
- redSquare e na le liparamente tsa loop hammoho le khokahano ea Y, nako le tieho.
- greenBall e na le tsela e nang le liparamente tsa ntho x, y ke boleng ba p. Ho phaella moo, nako, ho pheta-pheta le ho boreleli ke mosebetsi oa TweenOne.easing.path, e nang le mekhahlelo e 'meli.
- tsela - easePath.
- lengthPixel ke curve e arotsoeng ka kakaretso ea likarolo tse 400.
- pina ke oval e nang le lilepe, e na le mekhoa ea potoloho le parameter ea ho potoloha.
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,
},
};U boetse u hloka ho ela hloko karolo ea TweenOne. Likarolo tsohle li tla romelloa ho tsoa ho rc-tween-one. TweenOne ke karolo ea mantlha e nang le lisebelisoa tsa mantlha le li-animation props, tse emelang animation. TweenOne ka 'ngoe e na le liparamente tsa eona tsa animation, joalo ka redSquare, pina, 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>
);
} 
E, e shebahala e tšosa, empa animation e sebelisang mokhoa ona e bonolo.
<TweenOne component="g" animation={animate.redSquare} />
<TweenOne component="g" animation={animate.track} />
<TweenOne component="g" animation={animate.greenBall} />Seo u hlokang ho se etsa feela ke ho hlalosa melao ea animation le ho e fetisetsa ho karolo ea TweenOne.
Ho finyella lipakane tse fapaneng ho hloka mekhoa e fapaneng. Sengoliloeng sena se tšohlile litharollo tse 'maloa tse ka sebelisoang mererong e mengata. Ho ho uena ho khetha e nepahetseng.
Skillbox e khothaletsa:
- Thuto ea lilemo tse peli e sebetsang .
- Tsela ea inthanete .
- Thuto ea selemo e sebetsang .
Source: www.habr.com
