Javascript 匀速运动停止条件——逐行分析代码,让你轻松了运动的原理

原文:Javascript 匀速运动停止条件——逐行分析代码,让你轻松了运动的原理

我们先来看下之前的匀速运动的代码,修改了速度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了,一步一步往前肯定不会出现这样的问题。

时间: 2024-10-14 15:15:28

Javascript 匀速运动停止条件——逐行分析代码,让你轻松了运动的原理的相关文章

Javascript 学习笔记 缓冲运动——逐行分析代码,让你轻松了解缓冲运动的原理

看过上一篇关于Javascript 匀速运动文章的朋友相信对于运动已经有了初步的了解 接下来 讲一下关于缓冲运动的原理 ,我会逐行分析代码,代码简单易懂,能马上理解其中的原理,适用于初学者. #div1 { width: 100px; height: 100px; position: absolute; background: red; top: 50px; left: 0; /*600 初始值*/ } #div2 { width: 1px; height: 300px; position: a

Javascript 拖拽的一些简单的应用——逐行分析代码,让你轻松了解拖拽的原理

今天我们来看看如何让拖拽的物体不能拖出某个div之外和拖拽的吸附功能 上次讲到我们的拖拽是不可拖出可视区范围的,在这基础上我们加个父级的div,不让他拖出父级.原理和之前的一样,简单吧. <style type="text/css"> #div1 { width: 100px; height: 100px; background: red; position: absolute; } #div2 { width: 400px; height: 300px; backgrou

Javascript 拖拽的一些高级的应用——逐行分析代码,让你轻松了解拖拽的原理

我们看看之前的拖拽在周围有东西的时候会出现什么问题? 在高级浏览器中不会有啥问题,我们放到IE7下面测试一下,问题就出来了.如图 我们可以很清楚的看到,文字都已经被选中了.那这个用户体验很不好,用起来也不方便.顺便提一下,我们之前加了一个return false;帮我们解决了很多问题,如果去掉这个的话,chrome也会出现一样的问题.那么也就是说这个return false;可以解决chrome ff IE9+ 这些浏览器的问题. 实际上在我们开发中,页面上会有许多的元素组成,不可能就一个div

Javascript 拖拽雏形中的一些问题——逐行分析代码,让你轻松了拖拽的原理

今天我们就来解决上一次拖拽雏形中的一些问题.下面看看有哪些问题? 附上上期的Javascript代码,方便大家查看问题. <script type="text/javascript"> window.onload = function() { var oDiv = document.getElementById("div1"); var disX = 0; var disY = 0; oDiv.onmousedown = function(ev) { v

Javascript 拖拽雏形——逐行分析代码,让你轻松了拖拽的原理

拖拽的原理: 其实就是鼠标与左上角的距离保持不变.我们来看下图, 这红点就是鼠标.拖拽拖拽实际上来说就是通过鼠标的位置来计算物体的位置,就是这么简单,就是这么任性. 那这个距离怎么求呢?? 鼠标的位置-物体位置的差值就是那个距离 是吧.那这个斜线就是横线和竖线组成的. 我们距离看下程序怎么做. /*实际上他改的就是某个div 的left top ,那他就动起来了. 那样式中肯定要有绝对定位是吧.*/ <style type="text/css"> #div1 { width

Javascript 链式运动框架——逐行分析代码,让你轻松了运动的原理

所谓链式运动,就是一环扣一环.我们的很多运动实际上来说指的就是分阶段的,第一个阶段动完,下个阶段开始动.这个链式运动框架就是用来处理这些问题的. 我们先来看下之前的运动框架,以下是Javascript 代码 function getStyle(obj, name) { if (obj.currentStyle) { return obj.currentStyle[name]; } else { return getComputedStyle(obj, null)[name]; } } funct

Javascript 可同时变大边框等一系列效果运动框架——逐行分析代码,让你轻松了运动的原理

等待已久的可同时变大边框等一系列效果运动框架出炉了,现在还是个初级版本,能满足需求.我们看看是如何实现的. 我们知道在Javascript 中 ‘.’等同于 ‘[]’ 例如: oDiv.style.height=oDiv.style[‘height’] 那么,我们把要运动的属性作为一个参数,传入到之前函数中即可. 透明度呢,需要单独处理,判断下即可. 直接上代码. <style type="text/css"> div { width: 200px; height: 200

Javascript 多物体运动——逐行分析代码,让你轻松了运动的原理

我们先来看下之前的运动的代码,是否支持多物体运动,会出现怎么样的问题. <style type="text/css"> div { width: 100px; height: 50px; background: red; margin: 10px; } </style> <body> <div></div> <div></div> <div></div> </body>

Javascript 完美运动框架——逐行分析代码,让你轻松了解运动的原理

大家一听这名字就知道,有了这套框架 网上的效果基本都是可以实现的.实际上之前的运动框架还是有局限性的,就是不能让好几个值一块运动. 那这个问题怎么解决呢? 我们先来看看之前的运动框架 function getStyle(obj, name) { if (obj.currentStyle) { return obj.currentStyle[name]; } else { return getComputedStyle(obj, null)[name]; } } function startMov