zoukankan      html  css  js  c++  java
  • javascript运动框架

    下面这个一个运动框架可以控制元素在一个属性上的运动,同时,可以调用回调函数。

    /*
    获取元素某个属性的值
    @obj: 对象
    @attr: 属性值
    */
    function getStyle(obj, attr){
        if(obj.currentStyle){
            return obj.currentStyle[attr];
        }
        else{
            return getComputedStyle(obj, false)[attr];
        }
    }
    
    /*
    获取元素某个属性的值
    @obj: 对象
    @attr: 属性值
    @iTarget: 目标值(int)
    @fn: 回调函数
    */
    function startMove(obj, attr, iTarget, fn){
        clearInterval(obj.timer);
        obj.timer = setInterval(function(){
    
            if(attr =="opacity"){
                var iCur = parseInt(parseFloat(getStyle(obj, attr))*100);
            }else{
                var iCur = parseInt(getStyle(obj, attr));
            }
            
            var iSpeed = (iTarget-iCur)/8;
            iSpeed = iSpeed>0? Math.ceil(iSpeed): Math.floor(iSpeed);
    
            if(iCur == iTarget){
                clearInterval(obj.timer);
    
                if(fn){
                    fn();
                }
            }
            else{
                if(attr == "opacity"){
                    obj.style.filter = 'alpha(opacity:' + (iCur + iSpeed)+ ')';
                    obj.style.opacity = (iCur + iSpeed)/100; 
                }else{
                    obj.style[attr] = iCur + iSpeed + 'px';
                }
                
            }
        }, 30);
    }

    上面这个运动框架存在不足:它只能给一个属性设置动画,下面这个运动框架通过json来实现给多个属性同时设置动画:

    /*
    获取元素某个属性的值
    @obj: 对象
    @attr: 属性值
    */
    function getStyle(obj, attr){
        if(obj.currentStyle){
            return obj.currentStyle[attr];
        }
        else{
            return getComputedStyle(obj, false)[attr];
        }
    }
    
    
    /*
    获取元素某个属性的值
    @obj: 对象
    @json: {属性值1:目标值1,属性值2:目标值2,...}
    @fn: 回调函数
    */
    function startMove(obj, json, fn){
        clearInterval(obj.timer);
        obj.timer = setInterval(function(){
            var bStop = true;    //运动结束标致
            for(var attr in json){
    
                //1.取当前值
                iCur = 0;
                if(attr =="opacity"){
                    var iCur = parseInt(parseFloat(getStyle(obj, attr))*100);
                }else{
                    var iCur = parseInt(getStyle(obj, attr));
                }
                
                //2.算速度
                var iSpeed = (json[attr]-iCur)/8;
                iSpeed = iSpeed>0? Math.ceil(iSpeed): Math.floor(iSpeed);
    
    
                //3.检查停止
                if(iCur != json[attr]){
                    bStop = false;
                }
                
                if(attr == "opacity"){
                    obj.style.filter = 'alpha(opacity:' + (iCur + iSpeed)+ ')';
                    obj.style.opacity = (iCur + iSpeed)/100; 
                }else{
                    obj.style[attr] = iCur + iSpeed + 'px';
                }
            }
            if(bStop){
                clearInterval(obj.timer);
                if (fn) {
                    fn();
                };
            }
    
        }, 30);
    }

    弹性运动:

    var iSpeed = 0;
        var left = 0;
    
        function startMove(obj, iTarget){
            
            clearInterval(obj.timer)
    
            obj.timer = setInterval(function(){
                iSpeed+=(iTarget - obj.offsetLeft)/5;
                iSpeed*=0.7;
    
                left +=iSpeed;
    
                if(Math.abs(iSpeed)<1 && Math.abs(left - iTarget)<1){
                    clearInterval(obj.timer);
                    obj.style.left = iTarget + 'px';
                }else{
                    obj.style.left = left + 'px';
                }
                
            }, 30);
        }
    View Code

     弹性运动运用的范围有限,一般用于菜单的选择特效:带有滑块的导航条

  • 相关阅读:
    思考的乐趣
    编程的知识体系
    Android用Intent来启动Service报“java.lang.IllegalArgumentException: Service Intent must be explicit”错误的解决方法
    手拼SQL小技巧,WHERE 1=1
    n+1 < n , are you sure?
    java swing 去掉按钮文字周围的焦点框
    MyBatis使用动态SQL标签的小陷阱
    String、StringBuffer、StringBuilder的一些小经验……
    SQL Server 2012安装后找不到服务器名称的解决办法!!!
    CSS元素水平垂直居中方法总结(主要对大漠以及张鑫旭博客所述方法进行了归纳)
  • 原文地址:https://www.cnblogs.com/MockingBirdHome/p/3341021.html
Copyright © 2011-2022 走看看