zoukankan      html  css  js  c++  java
  • Javascript 缓冲运动——逐行分析代码,让你轻松了解缓冲运动的原理

    看过上一篇关于Javascript 匀速运动文章的朋友相信对于运动已经有了初步的了解

    接下来 讲一下关于缓冲运动的原理 ,我会逐行分析代码,代码简单易懂,能马上理解其中的原理,适用于初学者。

    #div1 {
                    width: 100px;
                    height: 100px;
                    position: absolute;
                    background: red;
                    top: 50px;
                    left: 0; /*600 初始值*/
                }
                #div2 {
                    width: 1px;
                    height: 300px;
                    position: absolute;
                    left: 300px;
                    top: 0;
                    background: black;
                }
    <body>
            <input type="button" id="btn" value="开始运动" onclick="startMove()" />
    
            <div id="div1">
    
            </div>
            <div id="div2">
    
            </div>
        </body>

    以下是Javascript 代码

    <script type="text/javascript">
                
                function startMove() {
                    var oDiv = document.getElementById("div1");
                    setInterval(function() {
                        var speed = (300 - oDiv.offsetLeft) / 10;
            
                        speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
    
                        oDiv.style.left = oDiv.offsetLeft + speed + 'px';
    
                    }, 30)
                }
            </script>

    这短短的几行代码,让我们看看其中有些什么原理,为何是这样写,实现缓冲运动。

    原理:

    当物体和终点之间的距离大的时候 速度是大的  距离不断的减小,速度也不断的减小

    也就是说 速度与距离成正比 这样就是缓冲运动的原理。

    代码分析:

    var speed = (300 - oDiv.offsetLeft) / 10;  300 是自己定义的目标点 , 也就是div1 要运动到哪个地方

    这里为什么要除以10呢 ?  因为 当物体的offsetLeft 为0 的时候 ,300-0=0   speed=300;

    这样运动会直接到达目标点,而没有了中间的过程。 本质的问题其实就是速度太大太快了,一下就到了终点。

    解决方案:除以10, 这样速度就变小了,就有了中间的过程。 那随着距离的越来越小 速度也就越来越小 达到缓冲的效果。

    若分母越小 速度越大 ,控制速度 去改变分母即可。

    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

    此时 除出来会有小数的情况 大家知道在css中 290.5px =290px , 299.9px = 299px 像素会舍去小数部分

    所以他运动到最后不会达到目标点 这样就会出现了bug ,附上图

    image 可以看到div2 作为一个标杆 物体并没有运动到底。

    解决方案: 就要取整。

    当div往右动, speed 为正 就ceil() , 若div的初始位置为600,那就是在向左走 , 此时speed是负值

    若算出来speed=-0.9  在ceil() 一下 那就是变成0了 ,就会出问题  所以要floor,向下取整

    最后结合起来判断speed 的正负 来调用不同的取整方式。 这套程序就可以 既往右边 又往左边运动。

    总结:

    往右边移动 就向上取整 / 左边就向下取整

    用缓冲运动一定要取整,否则就会出bug

    最后的效果

    image

  • 相关阅读:
    eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
    mave常用指令
    771. Jewels and Stones珠宝数组和石头数组中的字母对应
    624. Maximum Distance in Arrays二重数组中的最大差值距离
    724. Find Pivot Index 找到中轴下标
    605. Can Place Flowers零一间隔种花
    581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况
    747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
    643. Maximum Average Subarray I 最大子数组的平均值
    414. Third Maximum Number数组中第三大的数字
  • 原文地址:https://www.cnblogs.com/IcemanZB/p/4171156.html
Copyright © 2011-2022 走看看