zoukankan      html  css  js  c++  java
  • [Js]弹性运动

    描述:像弹簧一样左右弹动,最后缓慢停下来

    一、加减速运动

    1.加速运动

    var iSpeed=0;
    iSpeed++;

    速度越来越快,最后冲出去

    2.减速运动

    var iSpeed=20;
    iSpeed--;

    速度越来越慢,降到0后开始变负值往反方向运动

    二、弹性运动

    1.在目标点左边,加速;目标点右边,减速,如
    if(div1.offsetLeft<300){
        iSpeed=iSpeed+1;     //等同iSpeed++;
    }
    else{
        iSpeed=iSpeed-1;
    }

    这是最简单的弹性运动,缺陷:加速度恒定(应该根据松紧带而变)
    if(div1.offsetLeft<300){
        iSpeed=iSpeed+(300-div1.offsetLeft)/50;    
    }
    else{
        iSpeed=iSpeed-(div1.offsetLeft-300)/50;
    }
    iSpeed=iSpeed+(300-div1.offsetLeft)/50;   ==>iSpeed=iSpeed+300/50-div1.offsetLeft/50;
    iSpeed=iSpeed-(div1.offsetLeft-300)/50;    ==>iSpeed=iSpeed-div1.offsetLeft/50+300/50;

    这两个完全一样 所以不需要if/else

    iSpeed+=(300-div1.offsetLeft)/50;    
    div1.style.left=div1.offsetLeft+iSpeed+'px';

    缺陷2:不会停下来(缺少摩擦力)

    iSpeed+=(300-div1.offsetLeft)/50;    
    iSpeed*=0.95;    //乘一个小数,越来越小

    div1.style.left=div1.offsetLeft+iSpeed+'px';

    三、带摩擦力的弹性运动

    比较好的组合

    iSpeed+=(300-div1.offsetLeft)/5;    
    iSpeed*=0.7;

    注:var iSpeed=0;要放在定时器外面,不然每次都从0开始,加啊乘啊就没用了

    四、整合好的弹性运动框架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){   //因为iSpeed和left都是小数,所以永远达不到0和目标点,只能无限接近
                clearInterval(obj.timer);       //虽然速度最后接近于0,看似运动停止了,但定时器还一直开着,所以当速度=0并且到达目标点,关掉(只是速度=0关掉,运动到最右边准备回来那一刹那,速度=0,同理只是到达目标点关掉,一开始往右运动经过中间时会达到目标点,所以必须两者同时满足)
                obj.style.left=iTarget+'px';   //小数无法完全贴合,所以最后直接让他等于目标点,一般人肉眼看不出来
            }
            else{
                obj.style.left=left+'px';      //style.left只能是一个整数,所以每次会把小数抹掉,误差是累计的,最终累加起来就会有1-2像素,用obj.offsetLeft+iSpeed就会无法完全贴合
            }
        },30);
    };

    五、弹性运动不适用的地方

    样式会过界的

    比如高度,先变大后变小,如果物体本身高度很小,可能会变成负值,就不对了

  • 相关阅读:
    Java基础教程(15)--枚举类型
    Java基础教程(14)--嵌套类
    Java基础教程(13)--包
    Java基础教程(12)--深入理解类
    Java基础教程(11)--对象
    Java基础教程(10)--类
    Java基础教程(9)--流程控制
    Java基础教程(8)--表达式、语句和块
    Java基础教程(7)--运算符
    Java基础教程(6)--数组
  • 原文地址:https://www.cnblogs.com/zhangwenkan/p/3672902.html
Copyright © 2011-2022 走看看