javascript中的运动框架

本文介绍了一种基于JavaScript的运动框架实现方法,包括指定速度的匀速运动和减速缓冲运动两种方式,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运动框架


指定速度
/*
 *@param obj:运动对象
 *@param json:运动的目标值,以json格式表示,比如{"width": 300, "height": 300}
 *@param speed:运动速度
 *@param endFn:回调函数,可执行链式操作
 *@return undefined
 */
function move(obj,json,speed,endFn){

    clearInterval(obj.timer);
    var cur = 0;
    //存一下速度,因为后面需要来判断速度方向,不能在原值上更改,否则会引起混乱(值会在多个属性间混用)
    var sp = speed;

    obj.timer = setInterval(function(){

        //如果iBtn 为真,清除定时器
        var iBtn = true;
        var cur = 0;
        //遍历json中的属性
        for(var attr in json){

            //存值(目标值)
            var iTarget = json[attr];
            //获取当前属性值
            if( attr == "opacity"){
                //使用0-100的透明度值,因为小数的计算在计算机中是不精确的
                cur = Math.round(css( obj, 'opacity' ) * 100);
            }else{
                cur = parseInt( css( obj, attr) );
            }

            //区分速度方向
            speed = cur < iTarget ? sp : -sp;

            //检测
            //console.log(attr +":"+speed);

            //如果没有达到设置,继续运动
            if( cur != iTarget){

                cur = cur + speed;

                //如果运动超过设置,拉回来,否则正常进行
                if(cur > iTarget && speed > 0 || cur < iTarget && speed < 0) {
                    cur = iTarget;
                }else{
                    iBtn = false;
                }

                //运动一步
                if( attr == "opacity"){
                    obj.style.opacity = cur/100;
                    obj.style.filter = 'alpha(opacity='+ cur +')';
                }else{
                    obj.style[attr] = cur + "px";
                }
            }

        }


        if(iBtn){
            clearInterval(obj.timer);
            //方便链式运动
            endFn && endFn.call(obj);
        }

    }, 50);
}

function css(obj, attr) {
    if (obj.currentStyle) {
        return obj.currentStyle[attr];
    }else {
        return getComputedStyle(obj, false)[attr];
    }
}

减速缓冲运动
function bufferMove(obj,json,endFn){
    clearInterval(obj.timer);
    var cur = 0;
    obj.timer = setInterval(function(){
        var iBtn = true;
        var cur = 0;

        for(var attr in json){

            var iTarget = json[attr];
            if( attr == "opacity"){
                cur = Math.round(css( obj, 'opacity' ) * 100);
            }else{
                cur = parseInt( css( obj, attr) );
            }

            //这里是减速的方法,cur的值会越来越接近iTarget目标值,所以speed也会越来越小
            speed = ( iTarget - cur ) / 8;
            /*在js中取css样式的数值时, 当值到达小数点三位以后js会通过计算按照四舍五入来取值,
              比如设置宽度为: width:100.423534646, 在火狐中用obj.currentStyle[attr]或getComputedStyle(obj, false)[attr]来取得其值会得到300.417(作者也在思考,不过这已经可以证明js的小数取值很不精确),而在css样式中的值为100.423
              为了避免speed在与cur相加不能进位时css样式无任何变化,需要向上或向下取整(按照速度的方向,也就是正负值)
             */
            speed = speed > 0 ? Math.ceil(speed) :Math.floor(speed);


            if( cur != iTarget){

                cur = cur + speed;

                if(cur > iTarget && speed > 0 || cur < iTarget && speed < 0) {
                    cur = iTarget;
                }else{
                    iBtn = false;
                }

                if( attr == "opacity"){
                    obj.style.opacity = cur/100;
                    obj.style.filter = 'alpha(opacity='+ cur +')';
                }else{
                    obj.style[attr] = cur + "px";
                }
            }   
        }

        if(iBtn){
            clearInterval(obj.timer);
            endFn && endFn.call(obj);
        }

    }, 50);     
}

function css(obj, attr) {
    if (obj.currentStyle) {
        return obj.currentStyle[attr];
    }else {
        return getComputedStyle(obj, false)[attr];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值