Tween

Animate between two values over a set duration of time.

The behaviour and feel of the animation can be affected by providing a different easing function.

Import

import { tween } from 'popmotion';

Usage

By default, tween will tween from 0 to 1 over 300 milliseconds, with easeOut easing, and will output values to the function provided to start:

tween()
  .start(v => console.log(v))

Pass props to adjust the character of the tween:

tween({ to: 200, duration: 500 })

Value types

tween supports the animation of the following value types:

Number

tween({ from: 0, to: 1 })

Units

Supported: px, %, deg, vh, and vw

tween({ from: '0px', to: '100px' })

Colors

Supported: RGB(A), HSL(A) and Hex

tween({ from: '#fff', to: '#000' })
tween({ from: 'rgba(0, 200, 100, 1)', to: 'rgba(60, 100, 80, 0.5)' })
tween({ from: 'hsl(0, 50%, 50%)', to: 'hsl(180, 80%, 50%)' })

Complex

Complex sequences of values, like SVG path definitions, CSS shadows and background gradients.

The non-numerical portions of these values must stay in the same format in the from and to props.

tween({
  from: '0px 0px 0px inset rgba(0, 0, 0, 0.2)',
  to: '3px 3px 10px inset rgba(0, 0, 0, 0.5)'
})
tween({
  from: 'linear-gradient(to right, #fff, #000)',
  to: 'linear-gradient(to right, #333, #666)'
})

Objects

Named objects composed of any of the above types may also be animated.

ease can also be set as an object, to apply property-specific easing:

tween({
  from: {
    x: 0,
    background: 'hsla(125, 100, 50, 1)'
  },
  to: {
    x: 100,
    background: 'hsla(20, 100, 60, 1)'
  },
  ease: {
    x: easeOut,
    background: linear
  }
})

Arrays

Arrays composed of any of the above types may also be animated.

ease can also be set as an array, to apply property-specific easing:

tween({
  from: [0, '10vh', 'hsla(125, 100, 50, 1)'],
  to: [1, '20vh', 'hsla(20, 100, 60, 1)'],
  ease: [easeOut, backOut, linear]
})

Props

The following properties may be passed to tween:

from

Start value of the animation.

Default: 0

to

End value of the animation.

Default: 1

duration

Total duration of animation, in milliseconds.

Default: 300

elapsed

Duration of animation already elapsed, in milliseconds.

Default: 0

ease

A function that, given a progress between 0 and 1, will return a new progress value. Used to affect the speed of playback across the duration of the animation.

If from and to are set as objects or arrays, ease may be set with a corresponding structure to apply a unique easing for each animating value.

Default: easeOut

loop

Number of times to loop animation on complete. Set as Infinity to loop forever.

Default: 0

flip

Number of times to flip animation on complete. Set as Infinity to flip forever.

Default: 0

yoyo

Number of times to reverse animation on complete. Set as Infinity to reverse forever.

Default: 0

Methods

Action methods

tween() returns:

start

Starts the animation and returns playback controls.

Can be provided either a function:

tween().start(v => {})

Or a named map of functions for update and complete:

tween().start({
  update: v => {},
  complete: () => {}
})

filter

Returns a new version of the animation, that filters out any value when the provided predicate function returns false:

const filtered = tween().filter(v => v > 0.5)

// This animation will only output values higher than 0.5:
filtered.start(v => {})

pipe

Returns a new animation that will pass any output value through this series of functions:

// This animation will round output values and then double them:
tween({ from: 0, to: 100 })
  .pipe(Math.round, v => v * 2)
  .start(v => {})

while

Returns a new animation that will complete when the provided predicate function returns false:

// This animation will end when an output value is higher than 0.5:
tween().while(v => v < 0.5)

Playback methods

tween().start() starts a new animation and returns the following playback methods:

getElapsed

Returns time elapsed in milliseconds.

getProgress

Returns animation progress as a value of 0-1.

seek

Seeks animation to this position as a value of 0-1.

const playback = tween().start(v => {})

playback.seek(0.5)

pause

Pauses playback.

resume

Resumes playback.

reverse

Reverses the direction of playback.

stop

Stops the animation.

Example