Define a transition using the set method and apply it by calling start. You can use .setWithVendor to automatically include the right vendor prefix.
pp('.example')
.set('top', '80%')
.setWithVendor('border-radius', '100px')
.start();
Animate between multiple values of a single property by passing an array.
pp('.example')
.set('top', ['80%', '60%'])
.set('left', ['80%', '20%', '50%'])
.start();
Loop the transition by setting cycle in the configuration object or by calling .setSettings({ cycle: <num> }). Cycle can set to true to loop indefinitely or to an integer to set the number of cycles to run. A single cycle is one interation of a transition.
pp('.example', { cycle: 7 })
.set('top', ['80%', '60%', '20%', '40%'])
.set('left', ['80%', '20%', '50%'])
.start();
Change the timing or delay of each transition using the configuration object or by using the.setSettings method. Setting delay will set the delay before the next transition starts and initialDelay controls the delay before the first transition.
pp('.example')
.setSettings({ duration: 1000, delay: 250, initialDelay: 500 })
.set('padding', ['40px', '20px'])
.set('opacity', ['0.5', '1.0'])
.start();
Change the transition timing function by setting the ease option. Allowed easing values are:
Apply transforms using the .transform method.
pp('.example')
.set('top', ['80%', '30%', '50%'])
.transform('rotateX', ['180deg', '360deg', '0deg'])
.transform('rotateY', ['180deg', '0deg'])
.start();
Use the .animate method to set a CSS animation.
pp('.example')
.setDuration(1000)
.animate('twisterInDown')
.start();
You can pass in a function or an array of functions to set a property's value. If a single function is passed in it will be called for each iteration. You may want to set the number of cycles or the transition will never finish.
pp('.example')
.setCycle(5)
.set('top', function () {
return Math.floor((Math.random() * 80) + 1) + '%';
})
.transform('rotate', [
function () { return (this.inc + 1) * 45 + 'deg'; },
function () { return (this.inc + 1) * 90 + 'deg'; }
])
.start();
Proparty provides helper functions to add, subtract, multiply and divide from the current value of the property. You can easily extend proparty to add your own functions as well. Operations currently work best using pixels.
pp('.example')
.setCycle(5)
.set('top', pp.math.subtract('40px'))
.set('left', pp.math.add('40px'))
.start();
You can pause and stop transitions using .pause and .stop respectively. Starting after a pause will resume from the current cycle whereas a stop will resume from the first cycle.
var ppExample = pp('.example')
.setCycle(true)
.set('top', ['15%', '85%', '85%', '15%'])
.set('left', ['15%', '15%', '85%', '85%'])
.set('background-color', function () {
return '#' + (Math.random().toString(16) + '000000').slice(2, 8);
});
.start();
// pause transitions
ppExample.pause();
// stop transitions
ppExample.stop();
// destroy and call any queued up transitions
ppExample.destroy();
Use .whenStarted, .whenPaused and .whenStopped to register callbacks.
pp('.example')
.setCycle(6)
.transform('skew', ['20deg, 60deg', '-20deg, -60deg', '0deg, 0deg'])
.transform('rotateY', ['180deg', '180deg', '0deg'])
.whenStarted(function () { $('.text').html('Started!'); })
.whenPaused(function () { $('.text').html('Paused!'); })
.whenStopped(function () { $('.text').html('Stopped!'); })
.start();
Queue up transitions using the .chain method.
pp('.example')
.set('top', ['20%', '80%'])
.set('left', '20%')
.chain(function () {
return pp('.example-two')
.set('top', ['20%', '80%'])
.set('left', '80%')
})
.start();
Proparty supports all modern browsers with CSS transition support. Proparty also works in IE9 even though transitions are not supported.
None! Proparty is compatible with jQuery but does not require it.
Reduce internal state to allow for branching off of transitions without mutatation. i.e.
var ppOne = pp('.example').set('left', '20%');
var ppTwo = ppOne.set('top', ['20%', '80%']); // this will mutate ppOne
ppOne.start();
ppTwo.start();
Proparty was inspired by move.js, special thanks to the creators for an awesome library!