zoukankan      html  css  js  c++  java
  • JS学习之路,之弹性运动框架

      弹性运动:顾名思义,就如同物理中的加速减速运动,当开始时速度过大,到达终点时,速度不会立刻停下,而是再前进一段距离,而后再向相反方向运动,如此往复。

    var timer=null;
            var speed=0;
            //速度必须放在外面,放在里面的话,每次速度都是从0开始而不是保持上次执行的结果
            function move(){
                timer=setInterval(function(){
                    /*if (oDiv.offsetLeft<300) {
                        speed+=(300-oDiv.offsetLeft)/50;
                        //除以50是因为速度太大
                    }else{
                        speed-=(oDiv.offsetLeft-300)/50;}
                        //此处if,else里的两句执行语句化简过后是相同的
                            //都是speed=speed+300/50-oDiv.offsetLeft/50
                            //所以if,else语句可以省略掉*/
                    speed=speed+300/50-oDiv.offsetLeft/50;
                    
                    oDiv.style.left=oDiv.offsetLeft+speed+'px';
                },30);
            }

    弹性运动往往和摩擦运动结合使用,效果更佳,摩擦运动,即速度越来越小,经计算,比较人性化,合乎常规视觉的摩擦和弹性运动公式:

    speed+=(target-obj.offsetLeft)/5;
    speed*=0.7;

    弹性运动会出现有如下几个问题:

    1)无法到达指定位置-----小数误差问题
    2)如何解决?速度无法取整,使用变态方法----将要改变的值设置成变量


    弹性菜单;
    1)弹性运动过界问题:原因是当元素值过小时,会过界,速度会出现负值,可将速度为负时,将速度再设置
    为0,但也不能从根本上解决问题。所以要慎用弹性运动
    15,在使用弹性运动时,有时会出现运动过节的问题,因此有时要尽量避免使用弹性运动而是用缓冲运动

        var left=0;
           var speed=0;//速度必须放外面,否则就不是每次的执行结果了
            function move(obj,target){
                clearInterval(obj.timer);
                obj.timer=setInterval(function(){
                    speed+=(target-obj.offsetLeft)/5;
                        speed*=0.7;
                    /*obj.style.left=obj.offsetLeft+speed+'px';
                    //这种写法有误差,某一个li处会多或少一块,所以改成自定义变量left,如下面*/
                    left+=speed;
                    //为了提高效率,避免浪费资源,要关闭定时器
                    if (Math.abs(speed)<1 && Math.abs(left-target)<1) {
                        //判断条件就是距离足够近,速度足够小,利用绝对值
                        clearInterval(obj.timer);
                        obj.style.left=target+'px';
                        //以防万一,使定时器关闭时就卡在对应位置
                    }else{
                        obj.style.left=left+'px';
                        
                    }
                    document.title=obj.offsetLeft+' | '+target+' | '+speed;  //用于测试
                },30);
  • 相关阅读:
    SQL Server 存储过程
    String.format Tutorial
    第五次
    第四次
    第三次
    第一次作业
    第二次
    c/c++
    HelloWorld出现的问题
    Android系统架构
  • 原文地址:https://www.cnblogs.com/RitaLee/p/5618123.html
Copyright © 2011-2022 走看看