美文网首页
【学习笔记 】React ⑤ 动画效果

【学习笔记 】React ⑤ 动画效果

作者: Moombahton | 来源:发表于2019-12-10 10:37 被阅读0次
    • 借助transition实现渐隐渐现
    • 通过@keyframes定义一些动画效果
    • 使用react-transition-group实现动画

    transition

    import React, {Component, Fragment} from 'react';
    import './style.css'
    class App extends Component{
        constructor(props) {
            super(props)
            this.state = {
               show: true
            }
            this.handleToggole = this.handleToggole.bind(this)
        }
        render() {
            return (
                <Fragment>
                   <div className={this.state.show ? 'show' : 'hide'}>hello App</div>
                    <button onClick={handleToggole}>toggole</button>
                </Fragment>
            )
        }
        handleToggole() {
            this.setState({
                show: this.state.show ? false : true
            })
        }
    }
    export default App;
    
    
    .show{
     opacity: 1;
     transition: all 1s ease-in;
    }
    .hide{
    opacity: 0;
    transition: all 1s ease-in;
    }
    
    动画-transition.gif

    keyframes

    .show {
    animation: show-item 2s ease-in forwards;
    }
    .hide {
    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: red;
    }
    50% {
    opacity: 0.5;
    color: green;
    }
    100% {
    opacity: 1;
    color: blue;
    }
    }
    
    动画-keyframes.gif

    react-transition-group

    文档地址:https://reactcommunity.org/react-transition-group/

    yarn add react-transition-group
    
    1.对单个元素进行使用动画效果

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

    import React, {Component, Fragment} from 'react';
    import { CSSTransition } from 'react-transition-group'
    class App extends Component{
        constructor(props) {
            super(props)
            this.state = {
                 show: true
            }
            this.handleToggole = this.handleToggole.bind(this)
        }
        render() {
            return (
                <Fragment>
                    <CSSTransition
                        in={this.state.show}
                        timeout={1000}
                        classNames='fade'
                        unmountOnExit
                        // 入场动画结束之后(钩子函数,做一些JS操作)
                        onEntered={(el) => {el.style.color = 'blue'}}
                        // 第一次显示hello的时候,增加一个class fade-active
                        appear={true}
                    >
                        <div>hello App</div>
                    </CSSTransition>
                    <button onClick={this.handleToggole}>toggole</button>
                </Fragment>
            )
        }
        handleToggole() {
            this.setState({
                show: this.state.show ? false : true
            })
        }
    }
    export default App;
    
    

    动画和钩子函数的对应情况,可在对应的钩子函数中进行JS操作

    CSS 钩子函数
    fade-enter onEnter()
    fade-enter-active onEntering()
    fade-enter-done onEntered()
    fade-exit onExit()
    fade-exit-active onExiting()
    fade-exit-done onExited()
    .fade-enter, .fade-appear{
    opacity:0;
    }
    .fade-enter-active, .fade-appear-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;
    }
    
    动画-单个元素.gif

    如果实现更底层的动画效果可以使用Transition组件使用

    2.多个元素进行使用动画效果

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

    import React, {Component, Fragment} from 'react';
    import { CSSTransition, TransitionGroup} from 'react-transition-group'
    class App extends Component{
        constructor(props) {
            super(props)
            this.state = {
                show: true,
                list: []
            }
            this.handleAddItem = this.handleAddItem.bind(this)
        }
        render() {
            return (
                <Fragment>
                    <TransitionGroup>
                        {
                            this.state.list.map((item, index) =>{
                                return (
                                    <CSSTransition
                                        timeout={1000}
                                        classNames='fade'
                                        unmountOnExit
                                        // 入场动画结束之后
                                        onEntered={(el) => {el.style.color = 'blue'}}
                                        // 第一次显示hello的时候,增加一个class fade-active
                                        appear={true}
                                        key={index}
                                    >
                                        <div>{item}</div>
                                    </CSSTransition>
                                )
                            })
                        }
                    </TransitionGroup>
                    <button onClick={this.handleAddItem}>toggole</button>
                </Fragment>
            )
        }
        handleToggole() {
            this.setState({
                show: this.state.show ? false : true
            })
        }
        handleAddItem() {
            this.setState((prevState) => {
                return {
                    list: [...prevState.list, '这是添加的~~~']
                }
            })
        }
        // docs:https://reactcommunity.org/react-transition-group/transition-group
    }
    export default App;
    
    
    动画-多个元素.gif

    (完)

    相关文章

      网友评论

          本文标题:【学习笔记 】React ⑤ 动画效果

          本文链接:https://www.haomeiwen.com/subject/nuwjgctx.html