博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
和transformjs一起摇摆
阅读量:5979 次
发布时间:2019-06-20

本文共 2476 字,大约阅读时间需要 8 分钟。

写在前面

记得以前facebook做过一款HTML5游戏。开场动画是一块软体类似豆腐的东西一起摇摆。类似的效果如下面的gif所示:

105416-20161128130600349-445032634.gif

facebook当时使用的是createjs下的子项目easeljs和tweenjs去制作,基于Canvas的动画。基本的原理主要是:循环运动Canvas抽象的DisplayObject的skewX和scaleY来实现软体摇摆。

目前来看transformjs也能做到,因为transformjs也能运动skewX和scaleY。先来看看facebook的方式。

tweenjs + transformjs

注意这里的tweenjs是createjs下的子项目,而不是github上的tween.js项目。

var element = document.querySelector("#test");Transform(element);element.originY = 100;element.skewX = -20;var Tween = createjs.Tween,    sineInOutEase = createjs.Ease.sineInOut;Tween.get(element, {loop: true}).to({scaleY: .8}, 450, sineInOutEase).to({scaleY: 1}, 450, sineInOutEase);Tween.get(element, {loop: true}).to({skewX: 20}, 900, sineInOutEase).to({skewX: -20}, 900, sineInOutEase);

在线演示地址:

上面的代码很精简。这里稍微解释下:

  • 元素的初始skewX是-20,为了和scale的步调一致
  • 元素的originY是100,为的以企鹅的bottom center为基准点

可以看到,由于transformjs高度抽象,可以和tweenjs轻松搭配使用,没有任何压力。

AlloyFlow + transformjs

可能上面的代码不是很明白具体实现的流程?说实话,第一次看到上面的代码也没有一下看清晰流程。那么就使用AlloyFlow分解工作流的方式去实现同样的效果。

var element = document.querySelector("#test");Transform(element);element.originY = 100;element.skewX = -20;function sineInOut(a) {    return 0.5 * (1 - Math.cos(Math.PI * a));}var alloyFlow = new AlloyFlow({    workflow: [        {            work: function () {                To.go(element, "scaleY", .8, 450, sineInOut);                To.go(element, "skewX", 20, 900, sineInOut)            },            start: 0        }, {            work: function () {                To.go(element, "scaleY", 1, 450, sineInOut)            },            start: 450        }, {            work: function () {                To.go(element, "scaleY", .8, 450, sineInOut);                To.go(element, "skewX", -20, 900, sineInOut)            },            start: 900        }, {            work: function () {                To.go(element, "scaleY", 1, 450, sineInOut);            },            start: 1350        }, {            work: function () {                this.start();            },            start: 1800        }    ]}).start();

在线演示地址:

可以看到上面的workflow里面有一堆work按照start的时间依次序执行,最后在1800ms的时候调用this.start()会回到起点重新开始运行。还需要解释一下为什么选择sineInOut的easing。可以来看看其缓动图像:

105416-20161128130608365-1908586169.png

sineInOut速率是先慢后快再慢,刚好符合软体自身约束作用力的模拟。

那么,AlloyFlow是何方神器?且听下回单独开篇分解。

开始transformjs之旅

有很多童鞋问,transformjs还能做什么酷炫特效?怎么在官网看到的都是简单的效果?

其实transformjs他只是提供了基础的transformation能力,不与时间、和运动库耦合。可以和任意时间运动库配合使用。所以怎么酷炫完全靠大家创意和想象力,搭配transformjs使用就对了。
transformjs会计算出matrix3d赋给dom的 transform msTransform OTransform MozTransform webkitTransform,保证硬件加速和兼容性的同时,不丢失可编程性,点个赞....

主页:

Github :

转载地址:http://zuoox.baihongyu.com/

你可能感兴趣的文章
监听器listener
查看>>
js浮点数运算需要注意的问题
查看>>
常见注释
查看>>
CentOs6.5基本环境配置(三):mysql配置-修改mysql可外网访问
查看>>
removeAttribute调用问题
查看>>
Java的中文乱码处理
查看>>
ABBYY FineReader中识别结果该怎么进行保存
查看>>
java8 lambda表达式与集合类批处理操作
查看>>
解决spring jpa中配置文件报'jpa:repositories'的问题
查看>>
微信小程序开发库和项目
查看>>
bytes to String
查看>>
深研《TCP/IP详解卷一》第二篇——网络层(上)
查看>>
TODO:Google Analytics简单使用
查看>>
shell基础day10
查看>>
我的友情链接
查看>>
nginx常用配置
查看>>
vue use
查看>>
Linux命令(四)
查看>>
Elasticsearch的应用
查看>>
onBlur事件与onfocus事件
查看>>