一、是什么
在日常开发中,页面切换时的转场动画是比较基础的一个场景
当一个组件在显示与消失过程中存在过渡动画,可以很好的增加用户的体验
在react中实现过渡动画效果会有很多种选择,如react-transition-group,react-motion,Animated,以及原生的CSS都能完成切换动画
二、如何实现
在react中,react-transition-group是一种很好的解决方案,其为元素添加enter,enter-active,exit,exit-active这一系列勾子
可以帮助我们方便的实现组件的入场和离场动画
其主要提供了三个主要的组件:
- CSSTransition:在前端开发中,结合 CSS 来完成过渡动画效果
- SwitchTransition:两个组件显示和隐藏切换时,使用该组件
- TransitionGroup:将多个动画组件包裹在其中,一般用于列表中元素的动画
CSSTransition
其实现动画的原理在于,当CSSTransition的in属性置为true时,CSSTransition首先会给其子组件加上xxx-enter、xxx-enter-active的class执行动画
当动画执行结束后,会移除两个class,并且添加-enter-done的class
所以可以利用这一点,通过css的transition属性,让元素在两个状态之间平滑过渡,从而得到相应的动画效果
当in属性置为false时,CSSTransition会给子组件加上xxx-exit和xxx-exit-active的class,然后开始执行动画,当动画结束后,移除两个class,然后添加-enter-done的class
如下例子:
- export default class App2 extends React.PureComponent {
-
- state = {show: true};
-
- onToggle = () => this.setState({show: !this.state.show});
-
- render() {
- const {show} = this.state;
- return (
- 'container'}>
- 'square-wrapper'}>
-
- in={show}
- timeout={500}
- classNames={'fade'}
- unmountOnExit={true}
- >
- 'square'} />
-
-
-
-
- );
- }
- }
对应css样式如下:
- .fade-enter {
- opacity: 0;
- transform: translateX(100%);
- }
-
- .fade-enter-active {
- opacity: 1;
- transform: translateX(0);
- transition: all 500ms;
- }
-
- .fade-exit {
- opacity: 1;
- transform: translateX(0);
- }
-
- .fade-exit-active {
- opacity: 0;
- transform: translateX(-100%);
- transition: all 500ms;
- }
SwitchTransition
SwitchTransition可以完成两个组件之间切换的炫酷动画
比如有一个按钮需要在on和off之间切换,我们希望看到on先从左侧退出,off再从右侧进入
SwitchTransition中主要有一个属性mode,对应两个值:
- in-out:表示新组件先进入,旧组件再移除;
- out-in:表示就组件先移除,新组建再进入
SwitchTransition组件里面要有CSSTransition,不能直接包裹你想要切换的组件
里面的CSSTransition组件不再像以前那样接受in属性来判断元素是何种状态,取而代之的是key属性
下面给出一个按钮入场和出场的示例,如下:
- import { SwitchTransition, CSSTransition } from "react-transition-group";
-
- export default class SwitchAnimation extends PureComponent {
- constructor(props) {
- super(props);
-
- this.state = {
- isOn: true
- }
- }
-
- render() {
- const {isOn} = this.state;
-
- return (
-
"out-in" > -
"btn" - timeout={500}
- key={isOn ? "on" : "off"}>
- {
-
- {isOn ? "on": "off"}
-
- }
-
-
- )
- }
-
- btnClick() {
- this.setState({isOn: !this.state.isOn})
- }
- }
css文件对应如下:
- .btn-enter {
- transform: translate(100%, 0);
- opacity: 0;
- }
-
- .btn-enter-active {
- transform: translate(0, 0);
- opacity: 1;
- transition: all 500ms;
- }
-
- .btn-exit {
- transform: translate(0, 0);
- opacity: 1;
- }
-
- .btn-exit-active {
- transform: translate(-100%, 0);
- opacity: 0;
- transition: all 500ms;
- }
TransitionGroup
当有一组动画的时候,就可将这些CSSTransition放入到一个TransitionGroup中来完成动画
同样CSSTransition里面没有in属性,用到了key属性
TransitionGroup在感知children发生变化的时候,先保存移除的节点,当动画结束后才真正移除
其处理方式如下:
- 插入的节点,先渲染dom,然后再做动画
- 删除的节点,先做动画,然后再删除dom
如下:
- import React, { PureComponent } from 'react'
- import { CSSTransition, TransitionGroup } from 'react-transition-group';
-
- export default class GroupAnimation extends PureComponent {
- constructor(props) {
- super(props);
-
- this.state = {
- friends: []
- }
- }
-
- render() {
- return (
-
-
- {
- this.state.friends.map((item, index) => {
- return (
-
"friend" timeout={300} key={index}> - {item}
-
- )
- })
- }
-
-
-
- )
- }
-
- addFriend() {
- this.setState({
- friends: [...this.state.friends, "coderwhy"]
- })
- }
- }
对应css如下:
- .friend-enter {
- transform: translate(100%, 0);
- opacity: 0;
- }
-
- .friend-enter-active {
- transform: translate(0, 0);
- opacity: 1;
- transition: all 500ms;
- }
-
- .friend-exit {
- transform: translate(0, 0);
- opacity: 1;
- }
-
- .friend-exit-active {
- transform: translate(-100%, 0);
- opacity: 0;
- transition: all 500ms;
- }
参考文献
- https://segmentfault.com/a/1190000018861018
- https://mp.weixin.qq.com/s/14HneI7SpfrRHKtqgosIiA
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- 如何利用静态局部变量来达成单例模式?(怎样通过静态局部变量实现单例模式)
- Java 中二维数组声明的具体方法有哪些?(java二维数组声明的方法是什么)
- 如何在 Java 中获取 Word 文档内容?(java怎么获取word文档内容)
- 如何在 Java 集成测试中应用 Spock 框架?(Spock框架在Java集成测试中的应用)
- Dapr 究竟为 Java 生态系统带来了哪些贡献?(Dapr对Java生态系统有何贡献)
- 如何在 Java 中解析 XML 字符串?(java怎么解析xml字符串)
- Java 中常见的跳出循环的方式有哪些?(Java跳出循环的方式有哪些)
- Java Arrays 类中 copyOfRange 的使用场景有哪些?(Java Arrays类中copyOfRange的使用场景)
- 如何设置 Java Kubernetes 安全策略?(java kubernetes安全策略如何设置)
- 有哪些常用的 java 文本编辑器?(常用的java文本编辑器有哪些)
猜你喜欢
AI推送时光机 咦!没有更多了?去看看其它编程学习网 内容吧