move.js

'use strict';
/**
 * 获取CSS
 */
function getStyle(obj, attr) {
    return (obj.currentStyle || getComputedStyle(obj, false))[attr];
}

/**
 * JS动画框架 
 */
function move(obj, json, options) {
    if (!obj) return;
    json = json || {};
    options = options || {};
    options.speed = options.speed || 700;
    options.easing = options.easing || 'linear';

    var n = 0,
        c = Math.ceil(options.speed / 30),
        s = {},
        d = {};

    for (var i in json) {
        s[i] = parseFloat(getStyle(obj, i));

        if (isNaN(s[i])) {
            switch (i.toLowerCase()) {
                case 'width':
                    s[i] = obj.offsetWidth;
                    break;
                case 'height':
                    s[i] = obj.offsetHeight;
                    break;
                case 'left':
                    s[i] = obj.offsetLeft;
                    break;
                case 'top':
                    s[i] = obj.offsetTop;
                    break;
                case 'opacity':
                    s[i] = 1;
                    break;
                case 'borderWidth':
                    s[i] = 0;
                    break;
            }
        }

        d[i] = parseFloat(json[i]) - s[i];
    }

    var a,
        b,
        go = function () {
            n ++;
            for (var i in json) {
                switch (options.easing.toLowerCase()) {
                    case 'linear':
                        b = d[i] * n / c + s[i];
                        break;
                    case 'ease-in':
                        a = n / c;
                        b = d[i] * (1 - Math.pow(a, 3)) + s[i];
                        break;
                    case 'ease-out':
                        a = 1 - n / c;
                        b = d[i] * (1 - Math.pow(a, 3)) + s[i];
                        break;
                }
                if ('opacity' === i) {
                    obj.style[i] = b;
                    obj.style.filter = 'alpha(' + i + ' = ' + b * 100 + ')';
                }
                else {
                    obj.style[i] = b + 'px';
                }
            }

            if (n === c) {
                options.fn && (typeof options.fn === 'function') && options.fn.call(obj);
            }
            else {
                clearTimeout(obj.timer);
                obj.timer = setTimeout(go, 30);
            }
        };
    go();
}

 

posted @ 2016-06-07 15:00  koala_熊  Views(144)  Comments(0Edit  收藏  举报