第10章 动画

动画可以让用户体验变得更加流畅自然,而React的TransitionGroup插件配合CSS3可以让我们在项目中整合动画效果的变得易如反掌。

通常情况下,浏览器中的动画都拥有一套极其命令式的API,你需要选择一个元素并主动移动它或者改变它的样式,已实现动画效果。这种渲染方式显得格格不入,因此React选择了一种偏声明式的方法实现动画。

CSS渐变组(CSS Transition Group)会在何时的渲染及重渲染时间点有策略地添加和移动元素的class,以此来简化将CSS动画应用于渐变的过程,这意味着唯一需要你完成的任务就是给这些class写明合适的样式。

间隔渲染以牺牲性能为代价提供饿了更多的扩展性和可控性。这种方法需要更多次的渲染,但同时也允许你为CSS之外的内容,(比如滚动条位置及Canvas绘画)添加动画。

CSS渐变组:

<ReactCSSTransitionGrouptransitionName='question'>{questions}
</ReactCSSTransitionGroup>

ReactCSSTransitionGroup 是一款插件,它在文件最顶部通过var ReactCSSTransitionGroup =React.addons.ReactCSSTransitionGroup;语句引入。 它会自动在合适的时候处理组件重渲染,同时根据当前的渐变状态调整渐变组的class以便实现组件样式的改变。

给渐变的class添加样式

为元素添加transitionName ='question'意味着给它添加饿了4个class:question-enter、question-enter-active、question-leave及question-leave-active。当子组件进入或者退出ReactCSSTranstionGroup时,CSSTransitionGroup插件会自动添加或移除这些Class。

以下是问卷编辑器中使用到的渐变样式:

survey-editor.question-enter{transform:scale(1.2);transition:transform 0.2s cubic-bezier(.97,.84,.5,1.21);
}
.survey-editor.question-enter-active{transform:scale(1);
}
.survey-editor.question-leave{transform:translateY(0);opacity:0;transition:opacity 1.25,transgorm 1scubic-bezier(.52,-0.25,.52,.95);
}
.survey-editor.question-leave-active{opacity:0;transform:translateY(-100%);
}

渐变生命周期

question-enter与question-enter-active的区别在于,question-enter这个class是组件被添加到渐变组后即刻添加上的,而question-enter-active则是在下一轮渲染时添加的,这样设计让你能轻松的定义渐变开始时候的样式,结束时候的样式以及如何进行渐变。

例如:当问卷调查器重的问题被添加到列表的时候他们首先用scale(1.2)进行发大,然后渐变到正常的scale(1)状态,总共花了0.2秒,这就创造出了一种你看到的跳出来的效果。默认情况下,渐变组同事开启了进入和退出的动画,你可以通过给组件添加transitionEnter={false}或tranitionLeave={false}属性来禁用其中一个或全部禁用,除了可以控制选择哪些动画外,我们还能根据一个可配置 的值在特定的情况下禁用动画,像是这样:

<ReactCSSTransitionGrouptransitionName='question'transitionEnter={this.props.enableAnimations}transitionLeave={this.props.enableAnimations}>{questions}
</ReactCSSTransitionGroup>

使用渐变组的隐患

使用渐变组主要有两个重要的隐患需要注意

首先,渐变组会延迟子组件的移除直到动画完成,这意味着如果你把一个列表的组件包裹进一个ReactCSSTransitionGroup中,却没有trasitionName属性指定的class明确任何CSS,这些组件将无法被移除——甚至当你尝试不再渲染它们时也不可以。

其次渐变组每一个子组件都必须设置一个独一无二的key属性,渐变组使用这个属性来判断组件究竟是进入还是退出,因为如果没有设置key属性动画可能无法执行,同时组件会变得无法移除。

注意,即使渐变组只有一个子元素,它也需要设置一个key属性。

间隔渲染

使用CSS3动画能够获得巨大的性能提升并拥有简洁的代码,但他们并不总是解决问题的正确工具,有些时候,你必须为比较老,不支持CSS3的浏览器做兼容,还有些时候你想为CSS属性之外的东西添加动画,比如滚动条位置和Canvas绘画,这些情况下,间隔渲染能够满足我们的要求,但是相比CSS3动画来说,它会带来一定的性能损耗。

间隔渲染最基本的思想就是周期性的触发组件状态更新,以明确当前处于整个动画时间中的什么阶段。通过在组件的render方法中加入这个状态值,组件能够在每次状态更新触发的重渲染中正确的表示当前的动画阶段。

因为这种方法设计多次重渲染,所以通常最好和requestAnimationFrame一起使用以避免不必要的渲染,不过在requestAnimationFrame不被支持或不可用的情况下,降级到不那么智能的setTimeout就是唯一的选择了。

使用requestAnimationFrame实现间隔渲染

假设你希望使用间隔渲染将一个div从屏幕的一边移动到另一边,可以通过给他添加position:absolute并随着时间变化不停的更新left属性或者top属性来实现,根据消耗时间内的变化总量,用requestAnimationFrame来实现这个动画应该可以得出一个流畅的动画。

示例:page90

使用setTimeout实现间隔渲染

尽管requestAnimatingFrame总体上能够以最小的性能损耗实现最流畅的动画,但它在比较老的浏览器上无法使用的,而且它被调用的次数可能比你想象的更频繁(也更加无法预测)。这些情况下你可以使用setTimout。

示例:page91

总结:

  1. 在状态改变过程中,使用CSS3和渐变组高效的应用渐变动画。
  2. 使用requestAnimationFrame为CSS之外的东西添加动画,如滚动条位置或者Canvas绘画。
  3. 当requestAnimationFrame不被支持时降级到setTimeout方法。

React-引领未来的用户界面开发框架-读书笔记(四)相关推荐

  1. 读书笔记《React引领未来的用户界面开发框架》

    入门react,感觉这本书只是简单说了一些相关概念知识,并没有很详尽地展开论述,看了,做个总结笔记.

  2. React-引领未来的用户界面开发框架-读书笔记(五)

    第11章 性能优化 Reactde Dom diff算法使我们能够在任意时间点高效地重新绘制整个用户界面,并保证最小程度的DOM改变,然而,也存在需要对组件进行细致优化的情况,这时就需要渲染一个新的D ...

  3. React-引领未来的用户界面开发框架-读书笔记(二)

    第4章 数据流 由于react的数据流向是单向的(其父节点传递到子节点), 因此组件是简单且易于把握的(它们只需要从父节点获取props渲染即可) 假如顶层组件的某个prop改变了,react会递归地 ...

  4. React-引领未来的用户界面开发框架-读书笔记(一)

    这本书的主要内容都是以react v0.12为主,ES5语法,笔记中将会使用react v0.14和RS6. 第1章 react简介 1.本质上是一个状态机,它以精简的模型管理复杂的随着时间而变化的状 ...

  5. React-引领未来的用户界面开发框架-读书笔记(八)

    第16章 架构模式 React主要功能在于渲染HTML.可以将其看成是MVC中的V,它不会影响到组件中直接调用AJAX请求之类的操作: var TakeSurvey=React.CreateClass ...

  6. React-引领未来的用户界面开发框架-读书笔记(七)

    第14章 开发工具 React使用了若干的抽象层来帮助你更轻松地开发组件.推导程序状态.然而,在调试.构建及分发应用时,这样设计就会产生负面影响了. 幸运的是,我们拥有一些非常好的开发工具能在开发及构 ...

  7. React-引领未来的用户界面开发框架-读书笔记(六)

    第12章 服务端渲染 想让搜索引擎抓取到你的站点,服务端渲染这一步不可或缺,服务端渲染还可以提升站点的性能,因为在加载JavaScript脚本的同时,浏览器就可以进行页面渲染. React的虚拟DOM ...

  8. React-引领未来的用户界面开发框架-读书笔记(三)

    第8章 DOM操作 多数情况下,React的虚拟DOM足以用来创建你想要的用户体验,而根本不需要直接操作底层真实的DOM.然而也有一些例外.最常见的场景包括:需要与一个没有使用React的第三方类库进 ...

  9. 读书笔记《React:引领未来的用户界面开发框架》

    <React:引领未来的用户界面开发框架>(GitHub 附demo版) 1.Component的创建与复合 1.1 React简介 背景介绍,全书概览 1.本质上是一个状态机,它以精简的 ...

最新文章

  1. 微信公众号监听返回按钮问题解决
  2. 共享服务器设置权限修改,共享服务器权限设置
  3. 《敏捷企业》作者访谈录
  4. java快排原理_Java数据结构与算法——快速排序
  5. php如何减缓gc_管理信息传播-使用数据科学减缓错误信息的传播
  6. STM32学习——位带区的理解
  7. AI未成解药 流利说2019年净亏5.75亿 Q4付费用户再降20万
  8. 电子计算机工程 专业大学排名,电子与计算机工程专业大学排名 2021全国排行榜...
  9. SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.
  10. 【原版教材•中英对照】复合材料(第三版)— Krishan Chawla所著的广泛使用的教科书
  11. Opencv函数 rectangle函数与Rect函数的用法
  12. sqlmap使用教程(sqli-labs1-10详解)
  13. 【转】Unity 对象池(Object Pooling)理解与简单应用
  14. 04 CoCos Creator-Please make sure java is installed and JAVA_HOME
  15. html中点重置和提交没反应,网页点提交按钮没反应 js提交表单,点击按钮无反应...
  16. 网络爬虫学习笔记——网络爬虫简介
  17. electron安装报错: Electron failed to install correctly…的解决方案
  18. VMware16 安装Mac 10.14系统/苹果系统
  19. 调用Android短信软件进行短信群发
  20. parentNode和offsetParent的使用

热门文章

  1. google code for xbmc addons2
  2. ABP vNext微服务架构详细教程——简介
  3. 2022年终结版WPF项目实战合集发布
  4. 用BenchmarkDotNet看Property
  5. out参数不用赋值?这么神奇吗!
  6. Newbe.Claptrap 框架入门,第二步 —— 创建项目
  7. C# 实现一个基于值相等性比较的字典
  8. 【WPF】DataGrid多表头的样式设计
  9. MySQL对JSON类型UTF-8编码导致中文乱码探讨
  10. 错误使用.Net Redis客户端CSRedisCore,自己挖坑自己填