亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

js動畫框架設計

系統 2123 0

題記:?當你不再依賴JQuery時,當你已經厭倦了引入js類庫實現一些動畫效果的方式,當你想實現一個簡單而實用的動畫框架......下面介 紹下愚人設計的動畫框架:支持動畫緩動算法函數,如Linear、Cubic、Back、Bounce,支持改變高度,寬度,透明度,邊框,外邊距的基本 動畫,支持動畫的回調函數,如開始、暫停、完成的callback等。

?

js動畫框架設計

?

?

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

js動畫框架設計


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 在线 | 一区二区三区 | 亚洲天堂二区 | 91亚洲免费 | 京野结衣免费一区二区 | 99九九精品免费视频观看 | 国产一区二区三区免费在线视频 | 亚洲精品影院一区二区 | 日本不卡视频免费的 | 久久视频这里只有精品35 | 婷婷色香五月激情综合2020 | 最新精品在线 | 十大黄色免费网站 | 亚洲精品123区在线观看 | 800玖玖爱在线观看香蕉 | 亚洲精品国产精品乱码不97 | 特黄特黄一级片 | 亚洲高清在线mv | 99久久香蕉| 久久久国产一区二区三区 | 五月婷婷在线观看 | 你懂的国产精品 | 日韩毛片免费在线观看 | 久久99精品一久久久久久 | 91麻豆精品国产91久久久久 | 日韩欧美精品中文字幕 | 香蕉久久一区二区三区 | 97夜夜澡人人爽人人免费 | 成人精品一级毛片 | 久久99精品国产麻豆婷婷 | 凹凸精品视频分类国产品免费 | 一级毛片特黄久久免费看 | 国产在线精品香蕉麻豆 | 国产色 | 国产第一福利 | 91色综合综合热五月激情 | 好吊妞精品视频 | 欧美性色黄大片一级毛片视频 | 免费看国产一级特黄aa大片 | 桃色视频网| 插插天天 | 操bb影院|