js动画框架设计

标签: js 动画 框架 | 发表时间:2015-01-23 02:25 | 作者:天梯梦
出处:http://www.iteye.com

题记: 当你不再依赖JQuery时,当你已经厌倦了引入js类库实现一些动画效果的方式,当你想实现一个简单而实用的动画框架......下面介 绍下愚人设计的动画框架:支持动画缓动算法函数,如Linear、Cubic、Back、Bounce,支持改变高度,宽度,透明度,边框,外边距的基本 动画,支持动画的回调函数,如开始、暂停、完成的callback等。

 

 

 

Section One

 

游戏动画,Flash动画里一个比较重要的概念是 帧频,即每秒播放多少帧动画,一般动画是30帧/秒,单位为fps(frames per second)。

 

对于匀速运动来说:如果一个动画的持续时间duration为500ms,帧频frequence为30fps,则总帧数frames为 (500/1000)*30 = 15,即该动画过程有15个“画面”,每走一帧,都计算出一个画面: 画面当前位置 = 开始位置 + (当前帧/总帧数)(结束位置-开始位置),如果当前帧是最后一帧,则动画结束。其中setTimeout或setInterval每隔 (500/15)ms时间段调用一次函数,即计算一个画面。

 

来看下线性运动Linear缓动算法函数,t表示当前帧,b表示开始位置,c表示发生偏移的距离值,即当前位置-开始位置,d表示总帧数,符合上面 的推理解释,对于其他的算法函数,道理其实都是一样,只不过在运动过程中的曲线不同,有些呈现抛物线,有些呈现线性指数,对于数学感兴趣的可以研究下这些 算法函数,我也是略知皮毛:

Linear: function (t, b, c, d) {
	return c * t / d + b;
}

 

 

清楚了以上问题后,对于js的动画框架设计,就迎刃而解了,废话不多说,来个 demo 先。

 

 

Section Two

 

代码总体结构,具体说明看注释,需注意的问题: 1)在私有作用域里定义的变量,要在外部能访问到,需挂在window全局对象下,如window.Anim = Anim; 2)动画元素需要设置定位position属性; 3)传入的外边距参数需要驼峰式命名,并且当同时设置targetPos(元素目标位置)和外边距时,外边距的值会覆盖targetPos的值,如marginLeft的值会覆盖targetPos.left的值,因为外边距实现动画的原理也是利用元素的left、top值:

(function(window) {
    /*
     * 工具对象
     * 包含基本的dom操作,event操作
     */
    var util = {};
    util.dom = {
        // 获取元素计算样式
        getPropValue: function(element, propName) {
        },
        // 设置透明度
        setOpacity: function(obj, num) {
            document.all ? obj.filters.alpha.opacity = num : obj.style.opacity = num / 100;
        }
        // ......
    };
    util.event = {
        // 获取事件对象
        getEvent: function(event) {
        },
        // 获取事件源目标
        getTarget: function(event) {
        },
        // 注册事件
        addEvent: function(element, event, handler) {
        },
        // 删除事件
        removeEvent: function(element, event, handler) {
        },
        // 阻止默认行为
        preventDefault: function(event) {
        },
        // 阻止事件冒泡
        stopPropagation: function(event) {
        }
        // ......
    };

    /*
    * 动画缓动函数
    */
    var Tween = {
        Linear: function (t, b, c, d) { return c * t / d + b; },
        Quad: {
            easeIn: function (t, b, c, d) {
                return c * (t /= d) * t + b;
            },
            easeOut: function (t, b, c, d) {
                return -c * (t /= d) * (t - 2) + b;
            },
            easeInOut: function (t, b, c, d) {
                if ((t /= d / 2) < 1) return c / 2 * t * t + b;
                return -c / 2 * ((--t) * (t - 2) - 1) + b;
            }
        },
        // ...
    };

    /*
     * 核心动画
     * @elem 要执行动画的元素
     * @options left、top、opacity、width、height、border、marginLeft、marginRight、marginTop、marginBottom
     */
    function Anim(elem, options) {
        this.elem = elem;
        this.options = options;
        // 默认样式属性
        this.defaults = {
        };
    }
    Anim.prototype = {
        constructor: Anim,
        // 初始化动画
        init: function() {
            this.isStart = false;
            this.isStop = false;
            this.isComplete = false;
            this.isBack = false;
            this.start();
        },
        // 初始化数据
        before: function() {
        },
        // 开始动画
        start: function() {
        },
        // 动画过程
        run: function() {
            this.before();
            // 动画参数匹配
            this.match();
            // 原路返回
            if (this.isBack) {
                // ...
            }
            if (this.isStart) {
                this.onStart.call(this.elem);
                // 计算动画
                this.count();
            }
        },
        // 匹配动画的参数
        match: function() {
        },
        // 计算动画
        count: function() {
        },
        // 原路返回
        back: function() {
        },
        // 停止动画
        stop: function() {
        },
        // 重置元素
        reset: function() {
        }
    };

    // 全局使用
    if (!window.util) {
        window.util = util;
    }
    if (!window.Anim) {
        window.Anim = Anim;
    }
    if (!window.Tween) {
        window.Tween = Tween;
    }

})(window);

 

Last

使用非常简单,初始化参数对象,然后调用构造函数Anim即可:

// 动画参数设置
var options = {
    duration: 2000, // 动画持续时间
    frequence: 30, // 帧频
    tweenFunc: Tween.Linear, // 动画缓动函数
    targetPos: {left: 400, top: 300}, // 元素目标位置
    opacity: 40, // 透明度(可选)
    width: 80, // 宽度(可选)
    height: 80, // 高度(可选)
    // marginTop: 100, // 上边距(可选)
    border: '2px solid red', // 边框(可选)
    // 动画开始callback(可选)
    onStart: function() {
        // this指向当前动画元素
    },
    // 动画停止callback(可选)
    onStop: function() {
        // this指向当前动画元素
    },
    // 动画完成callback(可选)
    onComplete: function() {
        // this指向当前动画元素
    }
};
var anim = new Anim(animElem, options);

 

 

最后附上 源代码 以及easing算法函数的 demo

原文: http://www.cnblogs.com/cyStyle/p/4211783.html





已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [js 动画 框架] 推荐:

js动画框架设计

- - Web前端 - ITeye博客
题记: 当你不再依赖JQuery时,当你已经厌倦了引入js类库实现一些动画效果的方式,当你想实现一个简单而实用的动画框架......下面介 绍下愚人设计的动画框架:支持动画缓动算法函数,如Linear、Cubic、Back、Bounce,支持改变高度,宽度,透明度,边框,外边距的基本 动画,支持动画的回调函数,如开始、暂停、完成的callback等.

[Ext JS 4] MVC 应用程序框架

- - CSDN博客Web前端推荐文章
大型客户端应用程序总是很难编写,很难组织和很难维护. 随着功能的增加和更多的开发人员加入项目,对项目的控制也越来越困难了. Ext JS 4 提供了一个新的应用程序框架帮助组织代码. 模型 - 一组栏位和数据的集合. Model (在Ext JS 3中使用Record class). 视图 - 组件类型, grids,trees 和 panels 都是属于试图.

开源平台Meteor获投资,免费提供JS框架

- - ITeye资讯频道
开源平台 Meteor今日宣布A轮融资谈判结束,获得来自Andreessen Horowitz和Matrix Partners两家投资机构价值1120万美元的资金. 这是Andreessen Horowitz继 1亿美元投资Github之后又一次投资软件开发领域. Meteor公司提供的JavaScript框架开发平台目前免费使用,而且开源,可以用来创造类似于Google Docs的内容丰富的网页应用程序.

Appmobi刚发布针对移动HTML5的开源JS框架 jqMobi1.0

- - HTML5研究小组
Appmobi刚发布针对移动HTML5的开源JS框架 jqMobi1.0, 针对IOS和Android设备做了用户体验提升, 特性是体积小和速度快. jqUi, 针对触屏webkit核心浏览器的的一整套UI库. 网址: http://www.appmobi.com/.

闲来无事,写了段js仿google首页动画,附源码下载

- Jerry - 博客园-首页原创精华区
打开google,发现logo又有新玩意了,又是动画,简单看了一下,还是原来的老样子,将图片一部分一部分的显示出来做成动画效果,粗略估计了一下,功能应该挺简单的,隔了好久没手写js了,手痒痒,于是准备动手写几行代码看看. 谁知,一写又是一大串,不扯那么多,效果图如下:. 1.可以自动根据动画容器的尺寸来将图片分割成不同帧.

10个css3/javascript动画插件/框架

- - ria之家--RIA三部曲:jquery、ext、flex
jquery的一个用的人比较多的动画插件,非常的易用,效果也非常全面. 应该是目前针对transform最为全面的动画库,特点支持3D动画特性:. 非常牛逼的动画效果,文档和demo都很详细,虽然用于实战的场景不多(基于canvas的动画),不过依旧推荐认真看下. 相当不错的小动画库,能够产生大部分css3动画效果,关键是API非常易于理解,比如下面的代码:.

WebView JS 交互

- - ITeye博客
WebView加jquery做页面会怎么样呢. // 创建WebView对象. // 把programList添加到js的全局对象window中,. // 这样就可以使用window.programList来获取数据. * 定义js回调java函数. // 绑定键盘的向上,向下按钮事件触发相应的js事件.

JS游戏引擎

- 米随随 - HTML5研究小组
If you don’t have anything better to do and want to help fellow redditors interested in JS game dev out, feel free to fork the list and modify it as you like.

來源請求.js

- 红烧鲤鱼 - Blog: timdream
很早以前就想講了,但講了大概又會被戰. 相較於英文維基百科,中文維基百科在社會和歷史條目充滿了 systemic bias. 但是那些主觀論述又不是編輯者有意加進去的,而是某種編輯者存在的社會所給予的暗示(Inception?)與集體共識,而不是原本百科全書應該有的可驗證的事實. 因為是暗示又是共識,所以有自覺的百科編輯者反而是少數;中文維基只好長成現在這個樣子了.

Js删除节点

- - JavaScript - Web前端 - ITeye博客
 方式一:传this参数调用方法:.  方式二:js方法中通过选择器获取节点:. //此处删除的是a节点 }. 方式三:通过jQuery方式获取节点:(尚未测试,有待测试. 此处a标签传this到js中,js通过this(即a节点)取parent(即p节点). (1)p.remove();可直接删除整个p节点.