国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

淺談Javascript中勻速運動的停止條件

2019-11-20 13:39:33
字體:
來源:轉載
供稿:網友

我們先來看下之前的勻速運動的代碼,修改了速度speed后會出現怎么樣的一個bug。這里加了兩個標桿用于測試

復制代碼 代碼如下:

<style type="text/css">
            #div1 {
                width: 100px;
                height: 100px;
                position: absolute;
                background: red;
                top: 50px;
                left: 600px;
            }
            #div2 {
                width: 1px;
                height: 300px;
                position: absolute;
                left: 300px;
                top: 0;
                background: black;
            }
            #div3 {
                width: 1px;
                height: 300px;
                position: absolute;
                left: 100px;
                top: 0;
                background: black;
            }
        </style>
        <script type="text/javascript">
            var time = null;
            function startMove(iTarget) {
                var oDiv = document.getElementById("div1");
                clearInterval(time);
                time = setInterval(function() {
                    var speed = 0;
                    if (oDiv.offsetLeft < iTarget) {
                        speed = 7;
                    } else {
                        speed = -7;
                    }
                    // 其實這種情況是有問題的
                    oDiv.style.left = oDiv.offsetLeft + speed + 'px';
                   
                }, 30)
            }
        </script>
    </head>
    <body>
        <input type="button" id="btn" value="到100" onclick="startMove(100)" />
        <input type="button" id="btn" value="到300" onclick="startMove(300)" />
        <div id="div1">
        </div>
        <div id="div2">
        </div>
        <div id="div3">
        </div>
    </body>

其實這樣的代碼如果把速度改成7這種奇數,而到達目標點卻是一個整數,這樣就會出現未能達目標點或超過目標點來回抖動的bug

那為什么會出現這種情況呢 ?

實際上來說他到達目標點的時候無法精確到目標點,若目標點是100,每次走7個,這個時候他要么就是過了目標點,要么就是沒過。

永遠到不了目標點。其實幫之前的緩沖有點像。

那么到底怎么算才是到達了目標點呢?

舉個例子 : 你打車到某個地方,司機肯定是到哪里差不多離個10米20米就停下來了,就算到了。不可能要求汽車貼到那個地方停下來吧。

所以說呢,其實來講程序也是一樣的,我們只要物體和目標點之間的距離近到一定的程度,就不需要再近了,就認為到了。

我們看下修改后的代碼:

復制代碼 代碼如下:

<script type="text/javascript">
            var time = null;

            function startMove(iTarget) {
                var oDiv = document.getElementById("div1");
                clearInterval(time);
                time = setInterval(function() {
                    var speed = 0;
                    if (oDiv.offsetLeft < iTarget) {
                        speed = 7;
                    } else {
                        speed = -7;
                    }
                    if (Math.abs(iTarget - oDiv.offsetLeft) <= 7) {
                        clearInterval(time);
                        oDiv.style.left=iTarget+'px';
                    } else {
                        oDiv.style.left = oDiv.offsetLeft + speed + 'px';
                    }
                   
                }, 30)
            }
        </script>

解釋一下: 這里為什么要用 Math.abs 取絕對值呢?

理由很簡單,因為速度可能是正的可能是負的。

現在我們讓目標和物體之間的距離只要小于等7, 那就算到了。為什么是7呢? 因為他下一次的運動都不足7個了。這個時候我們就算他到了目標點了。

那現在問題又來了, 這樣寫 他并沒有精確的停在目標點的位置。所以我們加了一句簡單的話,直接讓left 等于目標點。oDiv.style.left=iTarget+'px';

實際上最后一次走的不足7個,但是大家都知道程序這個運行的太快了,人眼是看不出來的。熱烈的笑臉

這個時候就沒有問題了。眨眼

這個就是勻速運動的停止條件。 那有朋友問,為什么緩沖運動沒有這么麻煩呢?

因為他的速度是變的,越來越小,直到最后他甚至就到達1了,一步一步往前肯定不會出現這樣的問題。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台湾省| 彩票| 高雄市| 星座| 新疆| 克东县| 中阳县| 苗栗市| 扬中市| 清镇市| 拉萨市| 两当县| 乃东县| 柘城县| 法库县| 桐庐县| 彰化市| 乌海市| 新津县| 新邵县| 都江堰市| 淮安市| 吉木萨尔县| 若羌县| 安阳市| 巨野县| 乐昌市| 温泉县| 西峡县| 兰坪| 木兰县| 资源县| 望城县| 色达县| 武平县| 台江县| 南开区| 普兰县| 衡阳县| 铁力市| 鄂托克旗|