一. 过渡动画

  # index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './app';
ReactDOM.render(<App />, document.getElementById('root'));

  # app.js

import React, { Component, Fragment } from 'react';
import './style.css';
class app extends Component{
constructor(props){
super(props);
this.state = {
show : true
};
this.DivToggle = this.DivToggle.bind(this);
}
DivToggle(){
console.log(this.state.show)
this.setState({
show: this.state.show ? false : true
})
}
render() {
return (
<Fragment>
<div className={this.state.show? 'show': 'hide'}>你好啊</div>
<button onClick={this.DivToggle}>toggle</button>
</Fragment>
)
}
}
export default app;

  # style.css

.show{
opacity: 1;
transition: all 1s ease-in;
}
.hide{
opacity: 0;
transition: all 1s ease-in;
}

二.动画效果

  使用 keyframes 进行渲染 动画

# style.css

.show{
/* 使用 forwards css 动画最后一帧 保存 样式*/
animation: show-item 2s ease-in forwards;
}
.hide{
/* 使用 forwards css 动画最后一帧 保存 样式*/
animation: hide-item 2s ease-in forwards;
} @keyframes hide-item {
0% {
opacity: 1;
color: red;
}
50% {
opacity: 0.5;
color: green;
}
100% {
opacity: 0;
color: blue;
}
} @keyframes show-item {
0% {
opacity: 0;
color: blue;
}
50% {
opacity: 0.5;
color: green;
}
100% {
opacity: 1;
color: red;
}
}

三. 使用 react-transition-group CSSTransition 实现动画  (github 地址)  (文档)

  1. 安装 react-transition-group

    yarn add react-transition-group

  2. 引入 css-transition

    import { CSSTransition } fron 'react-transition-group'

  3. 将要 改变样式的元素用 CSSTransition 标签包裹起来

  eg:

    # index.js

import React from 'react';

import ReactDOM from 'react-dom';

import App from './app';

ReactDOM.render(<App />, document.getElementById('root'));

    # app.js

import React, {Component, Fragment} from 'react';

import {CSSTransition} from 'react-transition-group'

import './style.css'

class app extends Component

{

constructor(props){

super(props);

this.state={

show : true

}

this.DivToggle = this.DivToggle.bind(this);

}

DivToggle(){

console.log(this.state.show);

this.setState({

show: this.state.show? false : true

});

}

render(){

return (

<Fragment>

<CSSTransition

in={this.state.show}

timeout={1000}

classNames = "fade"

// 当隐藏后 去除挂载

unmountOnExit

// 当显示完成时 颜色变蓝  el 指 CSSTransition 内包裹的元素

onEntered={(el)=>{ el.style.color='red' }}

// 当退出显示时 颜色变黑  el 指 CSSTransition 内包裹的元素

onExited={(el)=>{ el.style.color='black' }}

// 第一次入场动画也要引入动画

appear={true}

>

<div className={this.state.show?'show':'hide'}>hello</div>

</CSSTransition>

<button type="button" onClick={this.DivToggle}>点一下</button>

</Fragment>

);

}

}

export default app;

    #style.css

/* 第一次加载的时候 */
.fade-appear{
opacity: 0;
}
/* 第一次入场的时候后到 第一次完成之前 */
.fade-appear-active{
opacity: 1;
transition: opacity 1s ease-in;
}
/* 入场动画执行的第一个时刻 */
.fade-enter{
opacity: 0;
}
/* 入场动画执行的第二个时刻 到 完成之前 */
.fade-enter-active{
opacity: 1;
transition: opacity 1s ease-in;
}
/* 入场动画执行的完成时刻 */
.fade-enter-done{
opacity: 1;
}
/* 出场动画开始第一个时刻 */
.fade-exit{
opacity: 1;
}
/* 出场动画开始第二个时刻到完成时刻之前 */
.fade-exit-active{
opacity: 0;
transition: opacity 1s ease-in;
}
/* 出场动画的完成时刻 */
.fade-exit-done{
opacity: 0;
}

四. 使用react-transition-group CSSTransition TransitionGroup 实现多个元素样式动画

#index.js

import React from 'react';

import ReactDOM from 'react-dom';

import App from './app';

ReactDOM.render(<App />, document.getElementById('root'));

#app.js

import React, {Component, Fragment} from 'react';

import {CSSTransition, TransitionGroup} from 'react-transition-group'

import './style.css'

class app extends Component

{

constructor(props){

super(props);

this.state={

list : []

}

this.AddItem = this.AddItem.bind(this);

}

AddItem (){

this.setState((prevState)=>{

return {

list : [...prevState.list, 'item']

}

})

}

render(){

return (

<Fragment>

{/* TransitionGroup 包裹住要展示动画的元素 */}

<TransitionGroup>

{

this.state.list.map((val, index)=>{

return (

// 内部要展示样式的元素 使用 CSSTransition 包裹并边写动画效果

// 这时可以删除 in 效果 没有手动点击变换效果

<CSSTransition

timeout={1000}

classNames="fade"

onEntered={(el)=>{el.style.color="red"}}

appear={true}

key={index}

>

<div key={index} >{val}</div>

</CSSTransition>

)

})

}

</TransitionGroup>

<button type="button" onClick={this.AddItem}>点一下</button>

</Fragment>

);

}

}

export default app;

#style.css

/* 第一次加载的时候 */
.fade-appear{
opacity: 0;
}
/* 第一次入场的时候后到 第一次完成之前 */
.fade-appear-active{
opacity: 1;
transition: opacity 1s ease-in;
}
/* 入场动画执行的第一个时刻 */
.fade-enter{
opacity: 0;
}
/* 入场动画执行的第二个时刻 到 完成之前 */
.fade-enter-active{
opacity: 1;
transition: opacity 1s ease-in;
}
/* 入场动画执行的完成时刻 */
.fade-enter-done{
opacity: 1;
}
/* 出场动画开始第一个时刻 */
.fade-exit{
opacity: 1;
}
/* 出场动画开始第二个时刻到完成时刻之前 */
.fade-exit-active{
opacity: 0;
transition: opacity 1s ease-in;
}
/* 出场动画的完成时刻 */
.fade-exit-done{
opacity: 0;
}

12 react 基础 的 css 过渡动画 及 动画效果 及 使用 react-transition-group 实现动画的更多相关文章

  1. Unity3D中暂停时的动画及粒子效果实现

    暂停是游戏中经常出现的功能,而Unity3D中对于暂停的处理并不是很理想.一般的做法是将Time.timeScale设置为0.Unity的文档中对于这种情况有以下描述: The scale at wh ...

  2. react中使用css动画效果

    index.js import React, { Component, Fragment } from 'react'; class App extends Component { construct ...

  3. CSS过渡动画之transition

    O(∩_∩)O~ 这两天在看看CSS的相关内容,关于transition动画感觉很有意思,分享一下. CSS负责给html加效果,自然少不了各种动画,今天介绍一下transition. 概述 看一段比 ...

  4. Vue——关于css过渡和动画那些事

    1. 单元素/组件的过渡transition Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡 条件渲染 (使用 v-if) 条件展示 (使用 v ...

  5. 36.React基础介绍——2019年12月24日

    2019年12月24日16:47:12 2019年10月25日11:24:29 主要介绍react入门知识. 1.jsx语法介绍 1.1 介绍 jsx语法是一种类似于html标签的语法,它的作用相当于 ...

  6. CSS过渡、CSS动画

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <script s ...

  7. 前端总结·基础篇·CSS(二)视觉

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·CSS(四)兼容 目录 一.动画(animation)(IE ...

  8. 第213天:12个HTML和CSS必须知道的重点难点问题

    12个HTML和CSS必须知道的重点难点问题 这12个问题,基本上就是HTML和CSS基础中的重点个难点了,也是必须要弄清楚的基本问题,其中定位的绝对定位和相对定位到底相对什么定位?这个还是容易被忽视 ...

  9. 前端总结·基础篇·CSS

    前端总结·基础篇·CSS 1 常用重置+重置插件(Normalize.css,IE8+) * {box-sizing:border-box;}  /* IE8+ */body {margin:0;}  ...

随机推荐

  1. docker 容器启动时设置环境变量source

    镜像启动时,自动执行的是~/.bashrc文件,所以,环境变量需要配置在该文件内,这样镜像启动时,可自动执行该文件,使环境变量生效. vi  ~/.bashrc ------------------- ...

  2. 提升Windows系统舒适度软件

    1.Geek Uninstaller 卸载软件 2.PotPlayer 无广告播放器

  3. 吴裕雄--天生自然java开发常用类库学习笔记:Iterator接口

    import java.util.List ; import java.util.ArrayList ; import java.util.Iterator ; public class Iterat ...

  4. SPI协议解析

    1. SPI物理层 SPI通讯需要使用4条线:3条总线和1条片选 . SPI遵循主从模式,3条总线分别是SCK.MOSI和MISO,片选线为nSS(低电平有效),SPI协议适用于一主多从的工作场景: ...

  5. MySql索引原理分析

    面试 问:数据库中最常见的慢查询优化方式是什么? 同学A:加索引. 问:为什么加索引能优化慢查询?同学A:...不知道同学B:因为索引其实就是一种优化查询的数据结构,比如Mysql中的索引是用B+树实 ...

  6. ORA-22813 ORA-06512

    ORA-22813:操作数值超出系统限制. 原因:   对象或集合值太大.SORT上下文中值的大小可能超过30k,或者可用内存的大小可能太大. 操作:  选择其他值并重试该操作. ORA-06512错 ...

  7. 【STM32H7教程】第51章 STM32H7的LTDC应用之LCD汉字显示和2D图形显示

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第51章       STM32H7的LTDC应用之LCD汉字 ...

  8. Vulkan SDK之 FrameBuffer

    The Vulkan Framebuffer Framebuffers represent a collection of memory attachments that are used by a ...

  9. Emacs: 设置窗口标题格式

    Emacs默认的窗口标题常常比较简单,例如我的默认标题是"emacs@ubuntu".如果想要在标题中显示更多的信息,我们可以对它进行一些设置.由于Emacs的可扩展性,这种修改实 ...

  10. 054-for循环

    <?php for($i=1;$i<=5;$i++){ echo "$i<br />"; //循环体 } ?>