动画效果,是一个页面上必不可少的功能,学习一个新的东西,当然就要学习,如何用新的东西,用它的方法去实现以前的东西啦。今天呢,我就在这里介绍一个试用react-addons-css-transition-group插件,在react中实现轮播图效果。

  首先,大家需要了解的是,页面中的动画,可以分为两种,一种是js动画,这是用js脚本来驱动的动画,另一种呢,就是用css的transiton和animation来实现的动画效果。而我要讲的插件,就是利用CSS的Transition和animation来实现组件的出场和入场动画。

  所以呢,我将先给大家简单介绍一下transition和animation,然后在介绍如何使用react-addons-css-transition-group插件,最后附上我实现的轮播图。

1. CSS3 transition

  现在假设我们想让一个元素,当我们hover时,它的宽高从50px变为100px。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. .box {
  8. width: 50px;
  9. height: 50px;
  10. background-color: #f00;
  11. }
  12. .box:hover {
  13. width: 100px;
  14. height: 100px;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div class="box"></div>
  20. </body>
  21. </html>

  如果我们之间运行上面这段代码,当我们hover时,元素大小瞬间就变成了100x100,很突兀,视觉效果很差。

  如果我们使用过渡transition属性的话,我们就可以让元素在我们指定的时间内,完成50x50到100x100的过渡动画。

  1. .box:hover {
  2. width: 100px;
  3. height: 100px;
  4. /* 指定过渡动画执行的时间,以及要执行动画的属性,
  5. 如果不指定直接改变,这里我们制定了宽高执行1s的过渡动画 */
  6. transition: 1s width, 1s height;
  7. }

  可以看到,使用transition后,变化就不再那么生硬了。我们还可以通过设置transition-delay,transition-timing-function 来设置延迟时间和过渡使用的变化函数。

  当然从上面的动态图,你也可以发现,transition的缺点,比如只有开始和结束两个状态,不能设置中间态,以及必须需要事件驱动,一条规则对应一个属性等。因此css3 animation属性出现啦。

2. CSS3 animation

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. .box {
  8. width: 100px;
  9. height: 100px;
  10. -moz-animation: rainbow 5s; /* Firefox */
  11. }
  12.  
  13. @-moz-keyframes rainbow {
  14. 0% {
  15. background-color: #f40;
  16. }
  17. 16% {
  18. background-color: #FF6100;
  19. }
  20. 33% {
  21. background-color: #FF0;
  22. }
  23. 50% {
  24. background-color: #0F0;
  25. }
  26. 66% {
  27. background-color: #00F;
  28. }
  29. 83% {
  30. background-color: #0FF;
  31. }
  32. 100% {
  33. background-color: #A020F0;
  34. }
  35. }
  36. </style>
  37. </head>
  38. <body>
  39. <div class="box"></div>
  40. </body>
  41. </html>

  最终执行效果为:

  动画是使元素从一种样式逐渐变化为另一种样式的效果,我们使用animation属性指定这个属性播放的动画名称,事件,动画函数等,我们用keyframes定义动画,规定在动画在关键帧样式。这是一个css3属性,在各大浏览器中使用,我们需要加相应的前缀。

  我们还可以通过animation的一些属性,自定义设置, 如延迟,结束状态,停止状态等等。

3. React react-addons-css-transition-group插件

  react-addons-css-transition-group插件,就是在上面两个css属性上实现,就像之前说的那样,它是利用css的transition和animation实现组件的进场和出场动画的。ReactCSSTransitionGroup是在ReactTransitionGroup的基础上进行再封装。

  我先直接附上我的代码,然后进行详细讲解。

  1. import React, {PropTypes} from 'react';
  2. import CSSTransitionGroup from 'react-addons-css-transition-group';
  3.  
  4. /* 定义参数类型 */
  5. const propTypes = {
  6. imageSrc: PropTypes.array.isRequired,
  7. currentIndex: PropTypes.number.isRequired,
  8. enterDelay: PropTypes.number.isRequired,
  9. leaveDelay: PropTypes.number.isRequired,
  10. name: PropTypes.string.isRequired,
  11. component: PropTypes.string.isRequired
  12. }
  13.  
  14. /* 轮播图片组件,无状态组件 */
  15. function CarouselImage(props) {
      /* 对象解析,参数分别对应:图片地址数组,当前展示图片索引,进场动画执行时间,出场动画执行时间,transition对应唯一key值,自动生成的包裹元素类型 */
  16. let {imageSrc, currentIndex, enterDelay, leaveDelay, name, component} = props;
  17.  
  18. return (
  19. <ul className="carousel-image">
  20. <CSSTransitionGroup
  21. component={component}
  22. transitionName={name}
  23. transitionEnterTimeout={enterDelay}
  24. transitionLeaveTimeout={leaveDelay}
  25. className={name}>
  26. <img
  27. src={imageSrc[currentIndex]}
  28. key={imageSrc[currentIndex]}
  29. />
  30. </CSSTransitionGroup>
  31. </ul>
  32. );
  33. }
  34.  
  35. CarouselImage.propTypes = propTypes;
  36.  
  37. export default CarouselImage;

  1. ReactCSSTransitionGroup工作原理

  当组件出现时,会在组件添加transitionName-appear类(transitionName由我们自己设置值),然后下一时刻会给组件添加transitionName-appear-active类;当组件进场时,给组件添加transitionName-enter类,然后下一时刻会给组件添加transitionName-enter-active类;当组件出场时,会给组件添加transitionName-leave类,然后下一时刻辉给组件添加transitionName-leave-active类,我们则可以在css文件中,通过设置transition,设置我们需要执行的动画。

  一般情况下,我们主要使用后两种,并且,只有当组件的出场动画完全执行玩以后,组件才会被移除。

  2. ReactCSSTransitionGroup组件参数

  ReactCSSTransitionGroup其实就是一个组件,它规定了特定的参数,我们通过设置这些特定的参数,将这些参数反应到被其包裹的子组件中。下面,我们就其几个常见的参数进行讲解。

  # transitionName: 设置动态生成类的自定义前缀,如果我们设置为carousel-image-item,那么,就会相应的生成carousel-image-item-enter, carousel-image-item-enter-active等。

  # component: 字符串,设置ReactCSSTransitionGroup生成包裹子组件的标签,默认时span,我们可以通过这个参数自定义,如div。

  # transitionEnter:  布尔值,设置是否使用出场动画,默认时true。

  # transitionEnterTimeout: 数值,设置入场动画的执行时间,需要在css中和这里同时设置,否则会提示警告。

  # transitionLeave:  布尔值,设置是否使用出场动画,默认时true。

  # transitionLeaveTimeout: 数值,设置出场动画的执行时间,需要在css中和这里同时设置,否则会提示警告。

  最后,说一下transitionAppear,它和其他两个不同,它默认时false,默认不执行。

  3. 使用步骤

  1)引包
  1.   import CSSTransitionGroup from 'react-addons-css-transition-group'; // ES6引包语法
  2)将 CSSTransitionGroup组件添加到render中
  1. return (
  2. <ul className="carousel-image">
  3. <CSSTransitionGroup
  4. component={component}
  5. transitionName={name}
  6. transitionEnterTimeout={enterDelay}
  7. transitionLeaveTimeout={leaveDelay}
  8. className={name}>
  9. <img
  10. src={imageSrc[currentIndex]}
  11. key={imageSrc[currentIndex]}
  12. />
  13. </CSSTransitionGroup>
  14. </ul>
  15. );

  在这里需要注意的是:CSSTransitionGroup组件需要添加到已经挂载到页面上的dom元素中(可以理解为,需要放在render函数中,且需要被包裹),或者transitionAppear设置为true的组件上。

  最后,我们只需在自己的css文件中,添加对应类的样式即可。

  我们可以在我们的生成的页面中看到下面结果:

  最后的最后,提一下六个TransitionGroup组件生命周期吧。其实我们上面使用的是别人给我们封装好的,我们直接添加参数,就可以实现这些效果,但是这只能实现简单的出场入场效果,如果要自定义一些动画的话,我们就需要通过在这些声明周期中设置回调函数,自定义动画。下面我们来简单了解一下着六个生命周期函数吧。

  1)ComponentWillAppear:组件将要出现时调用

  2) ComponentDidAppear: 组件出现时调用

  3) ComponentWillEnter: 组件将要进场时调用

  4) ComponentDidEnter:进场的下一时刻调用

  5) ComponentWillLeave:组件将要出场时调用

  6) ComponentDidLeave:出场的下一时刻调用

4. 轮播图效果

  最后,给大家分享我做的轮播图效果,以及代码。

  github地址:https://github.com/DiligentYe/react-carousel

  过程中,由于直接用webpack的css-loader加载scss文件,会改变自定义类名的问题,我不得自定义index页面,在页面中引入bundle.js文件和解析后的css文件。

React中使用CSSTransitionGroup插件实现轮播图的更多相关文章

  1. React Native学习(六)—— 轮播图

    本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...

  2. Bootstrap插件-carousel(轮播图)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. layui常用插件(一) 轮播图

    轮播图 <html lang="en"> <head> <meta charset="UTF-8"> <meta ht ...

  4. 插件-3D轮播图

    先上效果图 查看实例点击 这里  这个栗子中,可以选择展示 5 张 或者展示 3 张,即使是只有一个slide,也可以完成布局,正常轮播,麻麻再也不用怕只有4个slid而不能用这种轮播啦! 本栗实现原 ...

  5. vue项目中,使用vue-awesome-swiper插件实现轮播图

    一.安装 npm install vue-awesome-swiper 二.项目中引入 import 'swiper/dist/css/swiper.css'import {swiper,swiper ...

  6. slider插件制作轮播图

    html代码: <div id="banner_tabs" class="flexslider"> <ul class="slide ...

  7. swiper插件制作轮播图swiper2.x和3.x区别

    swiper3.x仅仅兼容到ie10+.比較适合移动端. swiper3.x官网  http://www.swiper.com.cn/ swiper2.x能够兼容到ie7+.官网是http://swi ...

  8. 原生JavaScript(js)手把手教你写轮播图插件(banner)

    ---恢复内容开始--- 1.轮播图插件 1.什么是插件: 为已有的程序增加功能 2.插件的特点(为什么要做成一个插件)与注意事项: 1.通用性,可移植性强 2.兼容性:不会对其他代码产生影响 3.创 ...

  9. 5 项目---自定义用户模型以及轮播图图片url返回格式

    创建自定义的用户模型类  1. 用命令创建users 应用 2. 将users 注册到settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'd ...

随机推荐

  1. 深入子元素的width与父元素的width关系

    深入理解父元素与子元素的width关系 对于这一部分内容,如果理解准确,可以更容易控制布局,节省不必要的代码,这里将简单研究. 第一部分:父子元素都是内联元素 代码演示如下: <!DOCTYPE ...

  2. APC注入

    0X01 注入原理 当线程被唤醒时APC中的注册函数会被执行的机制,并依此去调用我们的DLL加载代码,进而完成注入的目的 具体的流程: 1 当EXE里的某个线程执行到sleepEX(),或者waitF ...

  3. 全面理解java异常机制

    在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大V,你也不可避免出错,所以java为我们提供了异常机制.本文将会从以下几个方面介绍java中的异常机制: 异常机制的层次结构 异常的 ...

  4. Angular.js之服务与自定义服务学习笔记

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Java重写equals()和hashCode()

    1.何时需要重写equals() 当一个类有自己特有的 ”逻辑相等”概念(不同于对象身份的概念). 2.设计equals() [1]使用instanceof操作符检查 ”实参是否为正确的类型”. [2 ...

  6. JSP中三种弹出对话框的用法《转》

    对话框有三种 1:只是提醒,不能对脚本产生任何改变: 2:一般用于确认,返回 true 或者 false ,所以可以轻松用于 if...else...判断 3: 一个带输入的对话框,可以返回用户填入的 ...

  7. 浅解.Net分布式锁的实现

    序言 我晚上有在公司多呆会儿的习惯,所以很多晚上我都是最后一个离开公司的.当然也有一些同事,跟我一样喜欢在公司多搞会儿.这篇文章就要从,去年年末一个多搞会的晚上说起,那是一个夜黑风高的晚上,公司应该没 ...

  8. JavaScript的for循环中嵌套一个点击事件为何点击一次弹出多个相同的值

    先看下面一段代码: for(var i=0; i<10; i++) { $('#ul').bind('click', function() { alert(i) }) } 对于这段代码,当点击I ...

  9. js设置当前页面始终为框架最顶层

    使用iframe做的页面,当session失效时,登录页面会显示在iframe里面 解决办法判断登录页面是否为顶层页面,不是的话刷新顶层页面

  10. [POJ1028]Web Navigation(栈)

    这题是01年East Central North的A题,目测是签到题 Description Standard web browsers contain features to move backwa ...