现在已经有许多的javascript动画库插件,如 snabbt.js ,它们每一个都有自己的优点和不足。每个程序员和每个项目都有其特定的要求,所以有时一个动画库可能不能满足我们的需要。我们并不建议你放弃那些已经存在的动画库而去自己编写一个新的动画库,即使你有这样的能力。
Tweene能够帮你解决这个难题。Tweene是一个动画代理:它可以包装你选择的不同的动画库。它能够使你在这些动画库的基础上做更多的事情,并且他可以很容易的随时从一个动画库切换到另一个动画库。目前Tweene可以切换以下的动画库: GSAP 、 Velocity.js 、 Transit (CSS transitions)和 jQuery 。
要使用Tweene,你首先要引入以需要的动画库文件。
// use Tweene with GSAP <script src="/your/path/TweenMax.min.js"></script> <script src="/your/path/tweene-gsap.min.js"></script> // use Tweene with jQuery <script src="/your/path/jquery.min.js"></script> <script src="/your/path/tweene-jquery.min.js"></script> // use Tweene with Transit <script src="/your/path/jquery.transit.js"></script> <script src="/your/path/tweene-transit.min.js"></script> // use Tweene with Velocity.js <script src="/your/path/velocity.min.js"></script> <script src="/your/path/tweene-velocity.min.js"></script> // use Tweene with more then one library <script src="/your/path/TweenMax.min.js"></script> <script src="/your/path/jquery.transit.js"></script> <script src="/your/path/velocity.min.js"></script> <script src="/your/path/tweene-all.min.js"></script>
<script> // set the default time unit you want to use Tweene.defaultTimeUnit = 'ms'; // or 's' // set the default driver you want to use Tweene.defaultDriver = 'gsap'; // or one of 'transit', 'velocity', 'jquery' </script>
你可以通过Tweene.defaultTimeUnit 在Tweene中定制自己的时间单位(接收s或ms做单位)。
由于GSAP的默认时间单位是秒,如果你使用tweene-gsap.min.js 或require('tweene/gsap')来做动画库引擎,请注意Tweene预定义的时间单位,Tweene.defaultTimeUnit的值将是"s"。而其它的动画库使用的时间单位是毫秒,所以预定义时间单位为"ms"。
tween 是一个可以使你选定目标的属性进行动画的对象。这个模板可以是一个DOM元素或一组DOM元素。是什么对象取决于你选择的动画库。通常情况下是一个jQuery对象。
在Tweene 中创建一个新的实例或时间轴不需要 new 操作符。你只有使用它提供的一个静态方法来创建。这个方法是唯一可以创建对象的方法: get() 方法。
var tween = Tweene.get($target);
这将使用默认的引擎来创建一个Tweene对象,如果你想使用不同的动画库来创建Tweene对象(确保你使用的是完整版本的Tweene 并将所有的动画库引入你的页面中),你可以通过第二个参数来指定你需要的动画库。
var velocityTween = Tweene.get($target1, 'velocity'); var gsapTween = Tweene.get($target2, 'gsap'); var transitTween = Tweene.get($target3, 'transit');
每一个动画效果都至少需要一组我们想改变CSS属性。To() 方法用于指定属性的最终状态。下面来看看所有不同的语法:我们现在需要将目标元素在水平位置上移动并带有"fade-out"效果。默认时间单位是毫秒,延时为500毫秒,我们还指定一个easing 和回调函数。
var completeCallback = function() { console.log('just finished'); }; // jQuery syntax style: Tweene.to($target, {opacity: 0, left: '+=50px'}, 500, 'easeOutQuad', completeCallback); // GSAP syntax style, duration in seconds passed before properties, //all options passed inside the properties object: Tweene.to($target, '0.5s', {opacity: 0, left: '+=50px', ease: 'easeOutQuad', onComplete: completeCallback}); // Velocity.js syntax style, options grouped in an object passed as second parameter: Tweene.to($target, {opacity: 0, left: '+=50px'}, {duration: 500, easing: 'easeOutQuad', complete: completeCallback}); // single object syntax, as allowed by Transit: Tweene.to($target, {opacity: 0, left: '+=50px', duration: 500, easing: 'easeOutQuad', complete: completeCallback}); // Fluent syntax: Tweene.get($target) .to({opacity: 0, left: '+=50px'}) .duration(500) .easing('easeOutQuad') .on('complete', completeCallback) .play(); // tweens created with get() need to be started manually // alternative syntax: Tweene.get($target) .to({opacity: 0, left: '+=50px'}) .options({duration: '500ms' easing: easeOutQuad', complete: completeCallback}) .play(); // whatever mix of syntax you like, this is just an example: Tweene.get($target) .to({opacity: 0, left: '+=50px', easing: 'easeOutQuad'}, 500) .on('complete', completeCallback) .play();
如果你不想立刻开始动画,你只需要设置一下paused 属性即可。
var t = Tweene.to($target, {opacity: 0}, {duration: 500, paused: true}); // later, modify the previously set duration and run: t.duration(300).play();
通过Tweene你也可以创建开始动画,你可以为目标属性的指定开始值,而当前的值被设置为动画的结束状态。当前只有GSAP 库是天然支持这个方法的,但你可以通过Tweene使其它库也支持它。下面来看一下fade-in效果,当前元素的透明度为1。
// jQuery syntax style: Tweene.from($target, {opacity: 0}, 500); // GSAP syntax style: Tweene.from($target, '0.5s', {opacity: 0}); // Velocity.js syntax style Tweene.from($target, {opacity: 0}, {duration: 500}); // single object syntax Tweene.from($target, {opacity: 0, duration: 500}); // Fluent syntax: Tweene.get($target) .from({opacity: 0}) .duration(500) .play();
通过From和To你可以完全控制从开始到结束的动画属性值。这相当于Velocity.js用forcefeeeding 技术来定义开始属性。
// jQuery syntax style: Tweene.fromTo($target, {opacity: 0}, {opacity: 1}, 500); // GSAP syntax style: Tweene.fromTo($target, '0.5s', {opacity: 0}, {opacity: 1}); // Velocity.js syntax style Tweene.fromTo($target, {opacity: 0}, {opacity: 1}, {duration: 500}); // Fluent syntax: Tweene.get($target) .from({opacity: 0}) .to({opacity: 1}) .duration(500) .play(); // Mixed syntax example: Tweene.get($target) .from({opacity: 0}) .to({opacity: 1}, 500) .play();
你可以通过set()方法来改变对象的属性值:
Tweene.set($target, {left: 100, top: 200}); // using get and set: Tweene.get($target).set({left: 100, top: 200}); // setting properties with another library: Tweene.get($target, 'gsap').set({left: 100, top: 200});
// setting tween delay Tweene.to($target, {opacity: 0}, {duration: 500, delay: 200}); Tweene.get($target).to({opacity: 0}).duration(500).delay('0.2s'); Tweene.get($target).to({opacity: 0}).options({duration: 500, delay: '200ms'}); // setting timeline delay Tweene.line({delay: 200}); Tweene.line().delay('0.2s'); Tweene.line().options({delay: '200ms'});
// tween will run four times Tweene.to($target, {opacity: 0}, {duration: 500, loops: 3}); // tween will run in infinite loop Tweene.get($target).to({opacity: 0}).duration(500).loops(-1); // timeline will repeat twice ('repeat' is an alias for loops option) Tweene.line({repeat: 1}); Tweene.line().loops(1);
// setting tween loopsDelay Tweene.to($target, {opacity: 0}, {loops: 2, loopsDelay: 200}); Tweene.get($target).to({opacity: 0}).loops(2).loopsDelay('0.2s'); // you can use also repeat and repeatDelay as alias Tweene.get($target).to({opacity: 0}).options({repeat: 2, repeatDelay: '200ms'}); // setting timeline loopsDelay Tweene.line({loops: 2, loopsDelay: 200}); Tweene.line().loops(2).loopsDelay('0.2s'); Tweene.line().options({loops:2, loopsDelay: '200ms'});
Tweene.to($target, {opacity: 0}, {loops: 2, loopsDelay: 200, yoyo: true}); Tweene.get($target) .to({opacity: 0}) .loops(2) .loopsDelay('0.2s') .yoyo(true); Tweene.line({loops: 2, loopsDelay: 200, yoyo: true}); Tweene.line().loops(2).loopsDelay('0.2s').yoyo(true);
// set speed statically before the tween start: Tweene.to($target, {opacity: 0}, {duration: 2, speed: 0.7}); var t = Tweene.get($target) .to({opacity: 0}) .duration('5s') .play(); // during the tweening, slow down t.speed('half'); var t = Tweene.line($target) .to({opacity: 0}) .duration('5s') .play(); // go fast forward using the timeScale alias t.timeScale(3.5);
Tweene 为您提供了动画暂停、控制反转、恢复和重新开始的功能。
// start a tween var t = Tweene.to($target, {opacity: 0}, {duration: 2, paused: true}); t.play(); var t = Tweene.get($target) .to({opacity: 0}) .duration('5s') .play(); // start a timeline var t = Tweene.line($target) .to({opacity: 0}) .duration('5s') .play();
Tweene timelines 和 tweens定义了一系列的事件来让你控制动画关键点的回调事件。关于事件,你需要知道以下信息:
下面是一个如何设置回调函数和添加额外参数的例子:
// setting a simple begin callback var t = Tweene.get($target) .to({opacity: 0}) .duration(500) .on('begin', function() { console.log('starting'); }) .play(); // setting a complete callback with params and scope var t = Tweene.get($target) .to({opacity: 0}) .duration(500) .on('complete', function(a, b) { console.log('completed: ', a, b, this.attr('id')); }, [3, 'bye'], $target) .play(); // setting the same complete callback with different syntax var t = Tweene.to($target, '500ms', { opacity: 0, onComplete: function(a, b) { console.log('completed: ', a, b, this.attr('id')); }, onCompleteParams: [3, 'bye'], onCompleteScope: $target }); // setting progress event on a timeline var t = Tweene.line($target).to({opacity: 0}, {duration: '500ms', progress: function() { console.log('we are making progress here'); }});
别名:begin, onBegin, start, onStart。
别名:end, complete, onEnd, onComplete, finish, onFinish, done。
别名:reverse, onReverse, onReverseComplete。
别名:loop, onLoop, onRepeat。
别名: progress, onProgress, update, onUpdate。
关于Tweene的详细文档,请参考Tweene的官方网站:http://tweene.com/html/docs/