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

  • 相关阅读:
    EF框架开发后台错误问题集合
    如何实践MVP+RxJava+Retrofit(1)
    Android的FixScrollView自定义控件
    那些React-Native踩过的的坑
    P3105 [USACO14OPEN]公平的摄影Fair Photography
    模板合集
    关于最近情况的说明
    落谷P3941 入阵曲
    51nod 1952 栈
    BZOJ 2298: [HAOI2011]problem a
  • 原文地址:https://www.cnblogs.com/IcemanZB/p/4171156.html
Copyright © 2011-2022 走看看