We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
在日常开发中,页面切换时的转场动画是比较基础的一个场景
当一个组件在显示与消失过程中存在过渡动画,可以很好的增加用户的体验
在react中实现过渡动画效果会有很多种选择,如react-transition-group,react-motion,Animated,以及原生的CSS都能完成切换动画
react
react-transition-group
react-motion
Animated
CSS
在react中,react-transition-group是一种很好的解决方案,其为元素添加enter,enter-active,exit,exit-active这一系列勾子
enter
enter-active
exit
exit-active
可以帮助我们方便的实现组件的入场和离场动画
其主要提供了三个主要的组件:
其实现动画的原理在于,当CSSTransition的in属性置为true时,CSSTransition首先会给其子组件加上xxx-enter、xxx-enter-active的class执行动画
CSSTransition
in
true
xxx-enter
xxx-enter-active
class
当动画执行结束后,会移除两个class,并且添加-enter-done的class
-enter-done
所以可以利用这一点,通过css的transition属性,让元素在两个状态之间平滑过渡,从而得到相应的动画效果
css
transition
当in属性置为false时,CSSTransition会给子组件加上xxx-exit和xxx-exit-active的class,然后开始执行动画,当动画结束后,移除两个class,然后添加-enter-done的class
false
xxx-exit
xxx-exit-active
如下例子:
export default class App2 extends React.PureComponent { state = {show: true}; onToggle = () => this.setState({show: !this.state.show}); render() { const {show} = this.state; return ( <div className={'container'}> <div className={'square-wrapper'}> <CSSTransition in={show} timeout={500} classNames={'fade'} unmountOnExit={true} > <div className={'square'} /> </CSSTransition> </div> <Button onClick={this.onToggle}>toggle</Button> </div> ); } }
对应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再从右侧进入
on
off
SwitchTransition中主要有一个属性mode,对应两个值:
mode
SwitchTransition组件里面要有CSSTransition,不能直接包裹你想要切换的组件
里面的CSSTransition组件不再像以前那样接受in属性来判断元素是何种状态,取而代之的是key属性
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 ( <SwitchTransition mode="out-in"> <CSSTransition classNames="btn" timeout={500} key={isOn ? "on" : "off"}> { <button onClick={this.btnClick.bind(this)}> {isOn ? "on": "off"} </button> } </CSSTransition> </SwitchTransition> ) } 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; }
当有一组动画的时候,就可将这些CSSTransition放入到一个TransitionGroup中来完成动画
TransitionGroup
同样CSSTransition里面没有in属性,用到了key属性
TransitionGroup在感知children发生变化的时候,先保存移除的节点,当动画结束后才真正移除
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 ( <div> <TransitionGroup> { this.state.friends.map((item, index) => { return ( <CSSTransition classNames="friend" timeout={300} key={index}> <div>{item}</div> </CSSTransition> ) }) } </TransitionGroup> <button onClick={e => this.addFriend()}>+friend</button> </div> ) } 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; }
The text was updated successfully, but these errors were encountered:
No branches or pull requests
面试官:在react中组件间过渡动画如何实现?
一、动画
在日常开发中,页面切换时的转场动画是比较基础的一个场景
当一个组件在显示与消失过程中存在过渡动画,可以很好的增加用户的体验
在
react
中实现过渡动画效果会有很多种选择,如react-transition-group
,react-motion
,Animated
,以及原生的CSS
都能完成切换动画二、如何实现
在
react
中,react-transition-group
是一种很好的解决方案,其为元素添加enter
,enter-active
,exit
,exit-active
这一系列勾子可以帮助我们方便的实现组件的入场和离场动画
其主要提供了三个主要的组件:
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
如下例子:
对应
css
样式如下:SwitchTransition
SwitchTransition
可以完成两个组件之间切换的炫酷动画比如有一个按钮需要在
on
和off
之间切换,我们希望看到on
先从左侧退出,off
再从右侧进入SwitchTransition
中主要有一个属性mode
,对应两个值:SwitchTransition
组件里面要有CSSTransition
,不能直接包裹你想要切换的组件里面的
CSSTransition
组件不再像以前那样接受in
属性来判断元素是何种状态,取而代之的是key
属性下面给出一个按钮入场和出场的示例,如下:
css
文件对应如下:TransitionGroup
当有一组动画的时候,就可将这些
CSSTransition
放入到一个TransitionGroup
中来完成动画同样
CSSTransition
里面没有in
属性,用到了key
属性TransitionGroup
在感知children
发生变化的时候,先保存移除的节点,当动画结束后才真正移除其处理方式如下:
插入的节点,先渲染dom,然后再做动画
删除的节点,先做动画,然后再删除dom
如下:
对应
css
如下:参考文献
The text was updated successfully, but these errors were encountered: