Giter VIP home page Giter VIP logo

reanimation's Introduction

reanimation

An animation library for React


Why?

reanimation was developed specifically to solve a few problems:

  • Composition over Mixins
  • Support state-based animations
  • Support enter/leave animations
  • Avoid the DOM

There are a number of other libraries that solve similar problems in similar ways (including react.animate, which much of this library was based on).

Examples

reanimation works two ways: state-based animations and leave/enter animations. Both cases will use TestComponent as the component we would liketo animate:

import { Animate } from 'reanimation';

@Animate
export default class TestComponent extends React.Component {
	render() {
    	return (
        	<div style={this.props.style}>{this.props.children}</div>
        )
    }
}

State-Based

The first example is state-based animations. We use these animations when we want animations to respond to some change in state. Animations will animate when the animate prop is true and an existing animation isn't running.

import TestComponent from './test';

export default class App extends React.Component {     
    onComplete() {
        this.setState({
            doAnimation: false
        });
    }
    
    render() {
    	return(
        	<TestComponent 
                animate={this.state.doAnimation} 
            	startState={this.start} 
                endState={this.end} 
                duration={this.duration}
                easing={this.easing}
                onComplete={this.onComplete.bind(this)}
            >
				I can animate!
            </TestComponent>
		);
    }
}

The startState and endState prop is an object of style properties for javascript. For example, a fade-in would look like:

...
constructor(props) {
	super(props);
    
    this.start = {
    	opacity: 0
    }
    
    this.end = {
    	opacity: 1
    }

}
...

Not that you may want to change this.start and this.end to reflect the next animation, in addition to setting this.state.doAnimation to false.

Canceling

State-based transitions allow for canceling the transition, which will revert the state from the current animation state back to the start animation state in cancelDuration milliseconds when the cancel prop is true and there is an animation.

NOTE: Setting the cancel prop to true at the beginning of an animation will cancel the animation in the first frame. In most cases this will simply appear like nothing happened.

DOM-based

DOM-based animations function based on ReactTransitionGroup, allowing us to animate when the component is prepared to leave the DOM (without it leaving first).

import TestComponent from './test';
import Animations from 'reanimation';

export default class App extends React.Component {     
    onComplete() {
        this.setState({
            doAnimation: false
        });
    }
    
    onAddItem() {
    	let items = this.state.items;
        
        items.push(
        	<TestComponent key={this.state.items.length} />
        );
        
        this.setState({
        	items: items
        });
    }
    
    render() {
    	return(
            <Animations 
            	enter={this.enter} 
            	leave={this.leave}
            >
            	{this.state.items}
            </Animations>
		);
    }
}

In our enter/leave animation, the Animations take two properties: enter and leave. Both are objects with the following shape:

{
	duration: Number,
    ease: Easing,
    from: {
    	styleProperty: Number
    },
    to: {
    	styleProperty: Number
    }
}

Neither property is required, allowing you to dictate which DOM modification requires animation. In order for enter/leave animations to function, they must be a child of the Animations component and they must have a unique key.

Easings

Currently, the library supports the in out and in/out variations of the circ, cubic, expo, sine, quad, quart and quint bezier curve functions. Easings use the following format:

(in-)?(out-)?-function (for example in-quint, out-quint, in-out-quint are valid).

Additionally the library supports the CSS ease transitions as ease, in-ease, out-ease andin-out-ease.

Finally, added support is available for linear, swing and spring functions, as well as an ios-scroll animation.

The bezier curve functions are generated using Gaetan Renaudeau amazing bezier function generator. Additional animations will be made available via Koen Bok's spring function generator in Framer.js.

Dependencies:

  • raf requestAnimationFrame polyfill.
  • ReactTransitionGroup the core library ReactCSSTransitionGroup is based on and the reason enter/leave animations work.

Thanks

  • react.animate A nifty mixin for easy animations which spawned the initial idea for this library.
  • Velocity.js A performant javascript-based animation library that made libraries like this one possible.
  • Higher-order functions A simple example of Higher Order Components by Sebastian Markbåge.

reanimation's People

Stargazers

Khairold Safri avatar

Watchers

James Cloos avatar Justin Hall avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.