MooTools1.4源碼分析- Fx.Morph

 Mootools1.4 – Fx.Morph類的源碼分析,如果理解有誤歡迎指正:
 
/*

 
name: Fx.Morph
 
description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.
 
license: MIT-style license.
 
requires: Fx.CSS
 
provides: Fx.Morph
 
源碼分析: 苦苦的苦瓜(http://hmking.blog.51cto.com)
 

*/
 
// #region – Fx.Morph –
 
/**
* @Fx.Morph: 提供一次對多個CSS屬性進行動畫特效變換的功能,所以本類的屬性為多值集合
**/
Fx.Morph = new Class({
 
    // 繼承自Fx.CSS
    Extends: Fx.CSS,
 
    /**
    * @method: initialize
    * @param element – (mixed) 元素的id或引用
    * @param options – options – (object, 可選) Fx類中提供的可選項
    * @description: 構造函數,提供將多個元素的CSS屬性值從一個值向另一個值進行轉化的功能
    **/
    initialize: function (element, options) {
        // element屬性存儲特效所作用的元素對象
        this.element = this.subject = document.id(element);
        // 調用父類的同名方法
        this.parent(options);
    },
 
    /**
    * @method: set
    * @param now – (mixed) 可以是包含CSS屬性鍵值對的對象, 或是一個CSS選擇器(必須在頁面中已定義).如果對CSS屬性隻給出一個值,則變換的時候將把元素當前的屬性值作為起始值.
    *       {
    *           'height': 200,
    *           'width': 200,
    *           'background-color': '#f00',
    *           'opacity': 0
    *       }
    * @returns: (object) 主調Fx.Morph實例
    * @description: 將元素的指定CSS屬性值立即設為指定值
    **/
    set: function (now) {
        // 如果參數是字符串類型,表示為CSS選擇符,從當頁頁面的樣式規則中查找指定的規則
        if (typeof now == 'string') {
            now = this.search(now);
        }
        // 分別設置每一項樣式值
        for (var p in now) {
            this.render(this.element, p, now[p], this.options.unit);
        }
        return this;
    },
 
    /**
    * @method: compute
    * @param from – (object) 解釋過的各項樣式屬性的起始值的對象
    * @param to – (object) 解釋過的各項樣式屬性的結束值的對象
    * @param delta – (mixed) 特效變化所需要的比例因子
    * @returns: (array) 包含計算過的各項樣式屬性當前值信息的一個數組
    * @description: 根據各項樣式屬性初始值,結束值和特效比例因子計算各項樣式屬性的當前值
    **/
    compute: function (from, to, delta) {
        var now = {};
        for (var p in from) {
            // 對每一項樣式屬性,調用Fx.CSS類的同名方法計算
            now[p] = this.parent(from[p], to[p], delta);
        }
        return now;
    },
 
    /**
    * @method: start
    * @param roperties – (mixed) 可以是包含CSS屬性鍵值對的對象, 或是一個CSS選擇器(必須在頁面中已定義).如果對CSS屬性隻給出一個值,則變換的時候將把元素當前的屬性值作為起始值.
    *       {
    *           'height': [10, 100],
    *           'width': [900, 300],
    *           'opacity': 0,
    *           'background-color': '#00f'
    *       }
    * @returns: (object) – 主調Fx.Morph實例
    * @description: 串聯執行多個CSS屬性的變換(並觸發'start'事件)
    * @notes:
    *       如果傳入一個CSS選擇器, 則該選擇器必須在頁面存在相應匹配的樣式
    *       不支持多選擇器(逗號分隔的多個選擇器)
    *       @import'ed CSS rules will not be available for Morph calls. All CSS selectors must be present in CSS directly loaded into the page.
    **/
    start: function (properties) {
        // 檢查當前特效運行狀態,決定是否運行新特效
        if (!this.check(properties)) { return this; }
        // 如果提供properties參數類型為字符串,表明指定的是CSS選擇符名,需要從當前頁的樣式規則中查找各項屬性
        if (typeof properties == 'string') {
            properties = this.search(properties);
        }
        var from = {},
                to = {};
        // 對每項CSS屬性值計算解釋後的值,此時的from和to對象每個鍵值皆為一個數組
        for (var p in properties) {
            var parsed = this.prepare(this.element, p, properties[p]);
            from[p] = parsed.from;
            to[p] = parsed.to;
        }
        // 調用Fx類的構造函數
        return this.parent(from, to);
    }
 
});
 
// #endregion
 
// #region – Element.Properties.morph –
 
/**
* @element property: morph
* @description: 用於設置或獲取元素上的Fx.Morph實例,實現單件模式
**/
Element.Properties.morph = {
 
    // setter設置Fx.Morph對象參數
    set: function (options) {
        // 獲取元素上的Fx.Morph實例後先執行cancel方法,取消特效的執行,然後再設置可選參數
        this.get('morph').cancel().setOptions(options);
        return this;
    },
 
    // getter獲取Fx.Morph對象
    get: function () {
        // 先從臨時對象讀取,看有沒緩存到Fx.Morph實例
        var morph = this.retrieve('morph');
        if (!morph) {
            // 如果沒有緩存,則保存一個新的Fx.Morph實例
            morph = new Fx.Morph(this, { link: 'cancel' });
            this.store('morph', morph);
        }
        return morph;
    }
 
};
 
// #endregion
 
// #region – Element Method –
 
// 元素調用Fx.Morph的快捷方式
Element.implement({
 
    /**
    * @element method: morph
    * @param properties – (mixed) 可以是包含CSS屬性鍵值對的對象, 或是一個CSS選擇器(必須在頁面中已定義).如果對CSS屬性隻給出一個值,則變換的時候將把元素當前的屬性值作為起始值.
    * @returns: (element) 返回主調元素
    * @description: 對元素執行指定屬性值的動畫特效變換
    **/
    morph: function (props) {
        // 這是使用上面的getter取Fx.Morph實例,再start,props可以為多個樣式屬性數組或CSS選擇符
        this.get('morph').start(props);
        return this;
    }
 
});
 
// #endregion
 
作者“苦苦的苦瓜”

發佈留言