小菜AS3之路

2012.2.17
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JS运动框架

Posted on 2013-07-31 00:14  枫雨  阅读(2389)  评论(0编辑  收藏  举报
/**
 * 使用offsetLeft,需注意margin的使用
 * offsetLeft = margin-left + left;
 * offsetWidth= padding + border + width;
 * 
 * @author Lonve
 */
function getStyle(elem,attr){
    var result = null;
    result = elem.currentStyle?elem.currentStyle[attr]:getComputedStyle(elem,false)[attr];
    if(attr=="opacity"){
        return parseInt(parseFloat(result)*100);
    }
    return parseInt(result);
}


var timer = null;
//匀速运动停止条件--->距离足够近
function offsetMove1(offset){
    var oDiv = document.getElementById("oDiv");
    var speed = 0;
    speed = oDiv.offsetLeft < offset?10:-10;
    
    clearInterval(timer);
    timer = setInterval(function(){
        if(oDiv.offsetLeft >= offset){ //Math.abs(oDiv.offsetLeft - offset)<speed;
            clearInterval(timer);
        }else{
            oDiv.style.left = oDiv.offsetLeft + speed + "px";
        }
    },30)
}

//缓动运动条件 1.变化的运动速度,最后速度为零
//问题:offsetLeft
function offsetMove2(elem,offset){
    clearInterval(elem.timer);
    var speed = 0;
    elem.timer = setInterval(function(){
        speed = (offset - elem.offsetLeft)/8;
        speed = speed>0?Math.ceil(speed):Math.floor(speed);
        
        //是否到达到目标点
        if(elem.offsetLeft == offset){
            clearInterval(elem.timer);
        }else{
            elem.style.left = elem.offsetLeft + speed + "px";
        }
    },30)
}

//任意属性值
//避免小数值    parseInt(0.3*100)
function offsetMove3(elem,attr,offset){
    clearInterval(elem.timer);
    elem.timer = setInterval(function(){
        var curAttr = getStyle(elem,attr);            //当前属性值
        var speed = (offset - curAttr)/8;            //当前速度
        speed = speed>0?Math.ceil(speed):Math.floor(speed);
        
        if(offset == curAttr){
            clearInterval(elem.timer);
        }else{
            if(attr=="opacity"){
                elem.style.filter = "alpha(opacity="+(curAttr +speed)+")";
                elem.style.opacity= (curAttr + speed)/100;
            }else{
                elem.style[attr] = (curAttr + speed) + "px";
            }
        }
    },30)
}

//链式运动
function offsetMove4(elem,attr,offset,fn){
    clearInterval(elem.timer);
    elem.timer = setInterval(function(){
        var curAttr = getStyle(elem,attr);
        var speed   = (offset - curAttr)/8;
        speed = speed > 0? Math.ceil(speed):Math.floor(speed);
        
        if(offset == curAttr){
            clearInterval(elem.timer);
            if(fn){ fn(); }
        }else{
            if(attr=="opacity"){
                elem.style.filter = "alpha(opacity:"+(curAttr+speed)+")";
                elem.style.opacity= (curAttr+speed)/100;
            }else{
                elem.style[attr] = curAttr + speed + "px";
            }
        }
    },30)
}

//多个属性同时变化
function offsetMove5(elem,json,fn){
    var isStop = true;            //所有值都到达
    clearInterval(elem.timer);
    elem.timer = setInterval(function(){
        //历遍json属性
        for(var attr in json){
            //1.取当前与速度
            var offset  = json[attr];
            var curAttr = getStyle(elem,attr);
            var speed   = (offset - curAttr)/8;
            speed = speed > 0? Math.ceil(speed):Math.floor(speed);
            
            //2.检测停止
            if(offset!=curAttr){
                isStop = false;
            }
            if(attr=="opacity"){
                elem.style.filter = "alpha(opacity:"+(curAttr+speed)+")";
                elem.style.opacity= (curAttr+speed)/100;
            }else{
                elem.style[attr] = curAttr + speed + "px";
            }
        }
        //所有值都到达目标值,则停止
        if(isStop){
            clearInterval(elem.timer);
            if(fn){ fn(); }
        }
    },30);
}