React 动画 Animation
文章源自: https://facebook.github.io/react/docs/animation.html
ReactCSSTransitionGroup
基于 ReactTransitionGroup
,当一个React组件enter或者leave时可以方便的用来执行CSS transitions和animations。
导入ReactCSSTransitionGroup
import ReactCSSTransitionGroup from 'react-addons-css-transition-group' // ES6
var ReactCSSTransitionGroup = require('react-addons-css-transition-group') // ES5 with npm
var ReactCSSTransitionGroup = React.addons.CSSTransitionGroup; // ES5 with react-with-addons.js
定义组件
var React = require('react');
var ReactDOM = require('react-dom');
var CSSTransitionGroup = require('react-addons-css-transition-group');
var INTERVAL = 2000; var AnimateDemo = React.createClass({
getInitialState: function() {
return {current: 0};
}, componentDidMount: function() {
this.interval = setInterval(this.tick, INTERVAL);
}, componentWillUnmount: function() {
clearInterval(this.interval);
}, tick: function() {
this.setState({current: this.state.current + 1});
}, render: function() {
var children = [];
var pos = 0;
var colors = ['red', 'gray', 'blue'];
for (var i = this.state.current; i < this.state.current + colors.length; i++) {
var style = {
left: pos * 128,
background: colors[i % colors.length]
};
pos++;
children.push(<div key={i} className="animateItem" style={style}>{i}</div>);
}
return (
<CSSTransitionGroup
className="animateExample"
transitionEnterTimeout={1500}
transitionLeaveTimeout={1500}
transitionName="example">
{children}
</CSSTransitionGroup>
);
}
});
注意: 必须给 ReactCSSTransitionGroup 中的每一个child设置一个key属性,即使只渲染一个element
!
在这个组件中,当添加一个元素到 ReactCSSTransitionGroup 中时,这个元素将会自动添加上
example-enter
和 example-enter-active
样式。添加上的样式基于 transitionName 这个属性来设置。
我们需要做的就是定义example-xxx等样式;
.example-enter,
.example-leave {
-webkit-transition: all 2s;
transition: all 2s;
} .example-enter { /* begin **/
opacity: 0.01;
margin-left: 128px;
} .example-enter.example-enter-active { /* finish **/
opacity:;
margin-left:;
} .example-leave {
opacity:;
margin-left:;
} .example-leave.example-leave-active {
opacity: 0.01;
margin-left: -128px;
} .animateExample {
display: block;
height: 128px;
position: relative;
width: 384px;
} .animateItem {
color: white;
font-size: 36px;
font-weight: bold;
height: 128px;
line-height: 128px;
position: absolute;
text-align: center;
-webkit-transition: all 1s; /* TODO: make this a move animation */
transition: all 1s; /* TODO: make this a move animation */
width: 128px;
}
example-enter和example-enter-active分别表示动画开始和动画结束时的样式定义;
动画时间在css样式表中和render方法中,都必须指定,时间用来告诉React什么时候去移除animation样式以及什么时候从DOM中移除元素。
初始加载动画
ReactCSSTransitionGroup 提供了可选的属性 transitionAppear ,用来指定组件初始加载时的动画,该属性默认值是false,所以在组件加载的时候默认是没有动画的;
return (
<CSSTransitionGroup
className="animateExample"
transitionAppear={true}
transitionAppearTimeout={1500}
transitionEnterTimeout={1500}
transitionLeaveTimeout={1500}
transitionName="example">
{children}
</CSSTransitionGroup>
);
修改组件的render方法,并且在css中定义example-appear, example-appear-active样式;
.example-appear {
opacity: 0.01;
margin-left: 128px;
} .example-appear.example-appear-active {
opacity: 1;
margin-left: 0;
}
这样在组件初始加载的时候,也会有动画了!
组件第一次加载的时候,执行的动画是appear,之后再有element动态添加到CSSTransitionGroup,将会执行enter动画,而不会是appear动画;
transitionEnter和transitionLeave默认值是true,所以如果不把它们指定为false的话得指定transitionEnterTimeout和transitionLeaveTimeout。
自定义Classes
除了通过transitionName指定样式,还可以指定每一步的动画样式,其中,active样式名可以不用指定;
// ...
<ReactCSSTransitionGroup
transitionName={ {
enter: 'enter',
enterActive: 'enterActive',
leave: 'leave',
leaveActive: 'leaveActive',
appear: 'appear',
appearActive: 'appearActive'
} }>
{item}
</ReactCSSTransitionGroup> <ReactCSSTransitionGroup
transitionName={ {
enter: 'enter',
leave: 'leave',
appear: 'appear'
} }>
{item2}
</ReactCSSTransitionGroup>
// ...
Animating One or Zero Items
上面所实现的动画,都是整个Group中的元素都将被设置动画,实际上还可以指定只需要某一/零个元素执行动画;
import ReactCSSTransitionGroup from 'react-addons-css-transition-group'; function ImageCarousel(props) {
return (
<div>
<ReactCSSTransitionGroup
transitionName="carousel"
transitionEnterTimeout={300}
transitionLeaveTimeout={300}>
<img src={props.imageSrc} key={props.imageSrc} />
</ReactCSSTransitionGroup>
</div>
);
}
Animation Group Must Be Mounted To Work
为了组child添加动画属性,ReactCSSTransitionGroup
必须已经被加载到DOM中,或者将 transitionAppear
设置成true。
render() {
const items = this.state.items.map((item, i) => (
<div key={item} onClick={() => this.handleRemove(i)}>
<ReactCSSTransitionGroup transitionName="example">
{item}
</ReactCSSTransitionGroup>
</div>
)); return (
<div>
<button onClick={this.handleAdd}>Add Item</button>
{items}
</div>
);
}
上面这个例子将不会起作用,因为ReactCSSTransitionGroup
被加载到新的div中,而不是已经加载好的元素当中,且没有设置transitionAppear。
Disabling Animations
还可以禁止掉enter或者是leave动画,比如希望有enter动画而不想要leave动画,但是ReactCSSTransitionGroup需要等待动画完成后才从dom中remove元素,此时可以通过设置transitionEnter={false}或者transitionLeave={false}来禁止相应的动画;
在ReactCSSTransitionGroup中,没有动画完成的监听,所以如果想要获取到动画的执行进度并且添加其它操作是不可行的,如果确实有需要,可以使用ReactTransitionGroup;
React 动画 Animation的更多相关文章
- React-Router 动画 Animation
React-Router动画实际上和React动画没什么区别,都是使用 'react-addons-css-transition-group' 这个组件:但是,和普通的 React-Router 的 ...
- 【React自制全家桶】八、React动画以及react-transition-group动画库的使用
React动画通常有三种方法实现从易到难为: 1.transition(CSS3自带) 2.animation(CSS3自带) 3.react-transition-group动画库(需要引入插件) ...
- 动画animation的三个应用(漂浮的白云、旋转的星球、正方体合成)
× 目录 [1]漂浮的白云 [2]旋转的星球 [3]正方体合成 前面的话 前面介绍过动画animation的详细用法,本文主要介绍动画animation的三个效果 漂浮的白云 [效果演示] [简要介绍 ...
- CSS3的变形transform、过渡transition、动画animation学习
学习CSS3动画animation得先了解一些关于变形transform.过渡transition的知识 这些新属性大多在新版浏览器得到了支持,有些需要添加浏览器前缀(-webkit-.-moz-.- ...
- 精灵动画Animation对话框组成Idle动画的各精灵
精灵动画Animation对话框组成Idle动画的各精灵 1.3 精灵动画 场景中已经添加了精灵,现在是时候让让它动起来了.读者也许已经从精灵图集中,各精灵的命名中看出来了,这个精灵一共有两种动画状 ...
- Qt-4.6动画Animation快速入门三字决
Qt-4.6动画Animation快速入门三字决 Qt-4.6新增了Animation Framework(动画框架),让我们能够方便的写一些生动的程序.不必像以前的版本一样,所有的控件都枯燥的呆在伟 ...
- css3 动画(animation)-简单入门
css3之动画(animation) css3中我们可以使用动画,由于取代以前的gif图片,flash动画,以及部分javascript代码(相信有很多同学都用过jquery中的animate方法来做 ...
- Android 动画animation 深入分析
转载请注明出处:http://blog.csdn.net/farmer_cc/article/details/18259117 Android 动画animation 深入分析 前言:本文试图通过分析 ...
- View 动画 Animation 运行原理解析
这次想来梳理一下 View 动画也就是补间动画(ScaleAnimation, AlphaAnimation, TranslationAnimation...)这些动画运行的流程解析.内容并不会去分析 ...
随机推荐
- nodejs ejs模板数据库操作
1. 建立数据连接setting.js var settings = {}; settings.db = { host: 'localhost', user: 'root', password: '1 ...
- Java调用XML的方法:DocumentBuilderFactory
(1)首先得到:得到 DOM 解析器的工厂实例 DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance(); (2)然后从 D ...
- 将React Native 集成进现有OC项目中(过程记录) 、jsCodeLocation 生成方式总结
将RN集成到现有OC项目应该是最常见的,特别是已经有OC项目的,不太可能会去专门搞个纯RN的项目.又因为RN不同版本,引用的依赖可能不尽相同,所以特别说明下,本文参考的文档是React Native ...
- Thunder——Final冲刺中间产物
版本控制: http://www.cnblogs.com/lick468/p/7994015.html 软件功能说明书: http://www.cnblogs.com/szjzsd/p/7979565 ...
- java第三次实验报告
北京电子科技学院(BESTI) 实验报告 课程: Java程序设计 班级: 1352 姓名: 池彬宁 学号: 20135212 成绩: 指导教师: 娄嘉鹏 实验日期: 2015.6.3 实验密级: 无 ...
- hive-2.3.3安装
1.下载hive-2.3.3 下载地址 http://archive.apache.org/dist/hive/hive-2.3.3 解压,编辑/etc/profile添加HIVE_HOME,保存文件 ...
- Task 6.2站立会议三
今天我完成了软件的主要聊天界面的视频通话和语音通话的部分功能,过程中遇到很多不会的知识.因为使用的是C#,虽然很容易上手但是还会存在很多不懂得内容.
- VS2010中配置OpenGL
下面将对VS2010中配置OpenGL进行简单介绍. 学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Bu ...
- java 面试 -- 4
Java面试知识点总结 本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺(阅读本文需要有 ...
- 第一个spring冲刺
第一天商量讨论出我们选择的题目为四则运算,虽然在上一个学期已经做过了,但是还有完善的地方,希望能够做出创新,另外下面的燃尽图是我们预测的3个阶段的进度,按情况不同可能实际的情况也不同,但是我们会尽量跟 ...