react使用自定义动画CSSTransition详解
一、先下载依赖包
安装两个包 react-transition-group
和 @types/react-transition-group
1 | npm install react-transition-group @types/react-transition-group --save |
二、使用步骤
例子
APP.js文件中定义CSSTransition中的一些属性,和通过classNames自定义动画名字
1 | import React, { useState } from 'react'; |
App.css中根据CSSTransition中的classNames的属性值
编写对应想要的样式
1 | /* 显示的初始样式 */ |
运行效果图
三、CSSTransition参数
CSSTransition中的属性值的讲解
in:
必备的参数,默认是false,类型是boolean,切换状态时所用的值,是显示还是隐藏元素type:boolean
default: false
timeout:
延时type:number
classNames:
所应用样式的前缀
可以使string类型也可以是object类型
例子:
string型1
classNames="my-appear"
object类型
1
2
3
4
5
6
7
8
9
10
11classNames={{
appear: 'my-appear',
appearActive: 'my-active-appear',
appearDone: 'my-done-appear',
enter: 'my-enter',
enterActive: 'my-active-enter',
enterDone: 'my-done-enter',
exit: 'my-exit',
exitActive: 'my-active-exit',
exitDone: 'my-done-exit',
}}type: string | { appear?: string, appearActive?: string, appearDone?: string, enter?: string, enterActive?: string, enterDone?: string, exit?: string, exitActive?: string, exitDone?: string, }
default: ''
unmountOnExit:
消失时移除组件type:boolean
default: false
appear
刚加载时是否使用动画
appear要重点说明一下,应用场景是当元素在页面第一次加载渲染的时候显示在页面时,在页面加载渲染的时候是否执行动画,下面举个例子
App.js1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26import React, { useState } from 'react';
import './App.css';
import { CSSTransition } from "react-transition-group";
const App = () => {
const [open, setOpen] = useState(true); // 默认true
return (
<div className="App" >
<button onClick={() => setOpen(!open)}>toggle</button>
<CSSTransition
in={open}
timeout={300}
classNames="diy-transition"
unmountOnExit // 为true 代表退出的时候移除dom
appear // 为true 渲染的时候就直接执行动画,默认false,
>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</CSSTransition>
</div >
)
}App.css
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35/* 显示的初始样式 */
ul {
color: red;
}
/* 页面渲染时 */
.diy-transition-appear {
opacity: 0;
background-color: goldenrod;
}
.diy-transition-appear-active {
opacity: 1;
transition: all 300 ease-in-out;
}
/* 元素出现时 */
.diy-transition-enter {
opacity: 0;
}
/* 元素出现的最终样式 */
.diy-transition-enter-active {
opacity: 1;
background-color: rgb(32, 218, 209);
transition: all 300ms ease-in-out;
}
/* 元素消失时 */
.diy-transition-exit {
opacity: 1;
}
.diy-transition-exit-active {
opacity: 0;
background-color: green;
transition: all 300ms ease-in-out;
}运行效果:
四、CSSTransition回调函数
onEnter
组件的回调函数,当组件enter或appear时会立即调用。
type: Function(node: HtmlElement, isAppearing: bool)
onEntering
也是一个过渡组件的回调函数,当组件enter-active或appear-active时,立即调用此函数
type: Function(node: HtmlElement, isAppearing: bool)
onEntered
同样是回调函数,当组件的enter,appearclassName被移除时,意即调用此函数
type: Function(node: HtmlElement, isAppearing: bool)
onExit
当组件应用exit类名时,调用此函数
type: Function(node: HtmlElement)
onExiting
当组件应用exit-active类名时,调用此函数
type: Function(node: HtmlElement)
onExited
当组件exit类名被移除,且添加了exit-done类名时,调用此函数
type: Function(node: HtmlElement)
五、配合第三方库animate.css使用
安装 animate.css
npm install aniamte.css --save
在index.js中引入animate.css
1
import "animate.css";
在CSSTransition中的classNames中引入样式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29import React, { useState } from 'react';
import { CSSTransition } from "react-transition-group";
const App = () => {
const [open, setOpen] = useState(true);
return (
<div className="App" >
<button onClick={() => setOpen(!open)}>toggle</button>
<CSSTransition
in={open}
timeout={300}
classNames={{
appear:"animate__slideInDown", // 第一次加载动画
enter:"animate__fadeIn", // 显示动画
exit:"animate__fadeOut" // 消失动画
}}
unmountOnExit
appear
>
<ul className="animate__animated">
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</CSSTransition>
</div >
)
}运行效果:
-
2020-05-05
-
2020-08-02
-
2020-06-04
-
2020-10-30
-
2021-07-08