我想知道如何在React.js中实现一个动画组件/页面切换,希望能够像http://www.semplicelabs.com/上的过渡效果一样 - 一个标题过渡透明度和margin-top,一个内容过渡透明度。当显示新的组件/页面时,当前显示的组件/页面应该在新的组件/页面过渡进入之前过渡出去。我目前拥有的是一个
我还有两个页面组件,
我知道可以使用
这是我苦苦思索了几天,却找不到解决方案的问题。
一些可供测试的代码: https://jsfiddle.net/gonsfx/xva2g6oo/
LayoutComponent
,它将页面组件呈现到CSSTransitionGroup
中。import React from 'react/addons';
export default class LayoutComponent extends React.Component {
constructor(props) {
super(props);
this.state = { page: '' };
},
setPage(page) {
this.setState({ page });
}
render() {
return (
<React.addons.CSSTransitionGroup transitionName='page'>
{this.state.page}
</React.addons.CSSTransitionGroup>
);
}
}
我还有两个页面组件,
FirstPage
和 SecondPage
。import React from 'react';
export default class FirstPage extends React.Component {
render() {
return (
<div>
<header className='header'>
<div className='container'>
First Header
</div>
</header>
<div className='content'>
<div className='container'>
First Content
</div>
</div>
</div>
);
}
}
SecondPage
代码和 FirstPage
代码唯一的区别在于 .container
div 中的内容和类名。
接下来我尝试添加一个 .8s
持续时间的离开过渡和一个既有 .8s
持续时间又有延迟的进入过渡。我看到的主要问题是新页面组件在旧页面的离开过渡完成之前就已经挂载了。这是我的当前 CSS:
.page-enter {
background-color: #f2f2f2;
transition: background-color .8s linear .8s;
}
.page-enter-active {
background-color: #f2f1f1;
}
.page-leave {
background-color: #f2f1f1;
transition: background-color .8s linear;
}
.page-leave-active {
background-color: #f2f2f2;
}
.page-enter .header {
margin-top: -80px;
opacity: 0;
transition: opacity .8s ease-in-out .8s;
transition: margin-top .8s ease-in-out .8s;
}
.page-enter-active .header {
margin-top: 0;
opacity: 1;
}
.page-leave .header {
margin-top: 0;
opacity: 1;
transition: opacity .8s ease-in-out;
transition: margin-top .8s ease-in-out;
}
.page-leave-active .header {
margin-top: -80px;
opacity: 0;
}
.page-enter .content {
opacity: 0;
transition: opacity .8s ease-in-out .8s;
}
.page-enter-active .content {
opacity: 1;
}
.page-leave .content {
opacity: 1;
transition: opacity .8s ease-in-out;
}
.page-leave-active .content {
opacity: 0;
}
我知道可以使用
transitionAppear={true}
来动画化初始挂载 - 但这并不能解决新组件在旧组件过渡之前被挂载的问题。这是我苦苦思索了几天,却找不到解决方案的问题。
一些可供测试的代码: https://jsfiddle.net/gonsfx/xva2g6oo/