React项目中的动画组件选取

考虑过得方案

  • react-motion 非常酷炫如果要做复杂动画目前来看非它莫属,但是于我简单易复制的期望不符
  • animate.css 用css 实现了各种常见的动画效果,而且还有人封装了react-animated-css
  • react-transition-group 官方的方案容易上手,但是应对复杂动画比较无力,简单动画选择它

react 点击伸缩动画

import React, {Component} from 'react';
import styled from "styled-components";
import PropTypes from 'prop-types'
import {CSSTransition} from 'react-transition-group'

export default class TabBar extends Component{
    constructor(props) {
        super(props);
        this.state = {
            active:1,
            left:0,
            animationIn:false
        }
    }

    changeTab = (i) => {
        const length = this.props.tabs.length;
        this.setState({
            active:i,
            left: (100 / length) * (i - 1) + '%',
            animationIn:true
        })
        if(this.props.changeTab){
            this.props.changeTab();
        }
    }

    render() {
        const { tabs } = this.props;
        const { active, left } = this.state;
        const Root = styled.div`
        display: flex;
        alignItems: center;
        position: relative;
        .tab_bar {
            position: relative;
            height: 44px;
            line-height: 44px;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 8px 0;
            width:${100 / tabs.length}%;
            box-sizing: border-box;
            font-size: 15px;
            &:after{
                content:"";
                position: absolute;
                background-color: #ddd;
                display: block;
                z-index: 1;
                top: auto;
                right: auto;
                bottom: 0;
                left:0 ;
                width: 100%;
                height: 1px;
                transform: scaleY(0.5);
            }
        }
        .tab_bar_active {
            color: #108ee9;
        }
        .tab_bar_underline {
            position: absolute;
            border: 1px #108ee9 solid;
            -webkit-transform: translate3d(0, 0, 0);
            transform: translate3d(0, 0, 0);
            width: ${100 / tabs.length}%;
            left:${left};
            z-index: 2;
            bottom: 0;
            transition:left .3s;
            // transition:top .3s cubic-bezier(0.35, 0, 0.25, 1),left .3s cubic-bezier(0.35, 0, 0.25, 1),color .3s cubic-bezier(0.35, 0, 0.25, 1),width .3s cubic-bezier(0.35, 0, 0.25, 1);
            // -webkit-transition: top .3s cubic-bezier(0.35, 0, 0.25, 1),left .3s cubic-bezier(0.35, 0, 0.25, 1),color .3s cubic-bezier(0.35, 0, 0.25, 1),width .3s cubic-bezier(0.35, 0, 0.25, 1);
            &:hover {
                left: 50px;
            }
        }
        
            
        .card-enter,.card-appear{
            opacity: 0;
            transform:scale(.3);
        }
        .card-enter-active,.card-appear-active{
            opacity: 1;
            transform: scale(1);
            transition: opacity 300ms,transform 300ms;
        }
        .card-exit{
            opacity: 1;
            transform: scale(1);
        }
        .card-exit-active{
            opacity: 0;
            transform: scale(.3);
            transition: opacity 300ms,transform 300ms;
        }
        .card-exit-done{
            opacity: 0;
        }
        `
        return (
            <Root>
                {
                    tabs.map((item,index)=>(
                        <div key={item.key}
                             onClick={()=>{this.changeTab(index + 1)}} className={`tab_bar ${ (index + 1) === active && 'tab_bar_active'}`}>
                                {item.title}
                        </div>
                    ))
                }
                <CSSTransition
                    in={ this.state.animationIn }
                    timeout={ 1000 }
                    classNames='card'
                    appear
                >
                    <div className={'tab_bar_underline'} />
                </CSSTransition>
            </Root>
        )
    }

}

TabBar.prototypes = {
    tabs:PropTypes.array.isRequired
}

TabBar.defaultProps ={
    tabs:[
        {
            title:'标题1',
            key:1
        },
        {
            title:'标题2',
            key:2
        },
        {
            title:'标题3',
            key:3
        },
    ]
}

 

posted @ 2020-01-15 15:01  一路向北√  阅读(358)  评论(0编辑  收藏  举报

web应用开发&研究 -

业精于勤而荒于嬉。

工作,使我快乐。


Font Awesome | Respond.js | Bootstrap中文网