浅谈Javascript中匀速运动的停止条件


Posted in Javascript onDecember 19, 2014

我们先来看下之前的匀速运动的代码,修改了速度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

浅谈Javascript中匀速运动的停止条件

那为什么会出现这种情况呢 ?

实际上来说他到达目标点的时候无法精确到目标点,若目标点是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了,一步一步往前肯定不会出现这样的问题。

Javascript 相关文章推荐
jQuery1.6 正式版发布并提供下载
May 05 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
Apr 15 Javascript
JavaScript设计模式之外观模式实例
Oct 10 Javascript
node.js中的http.request方法使用说明
Dec 14 Javascript
js的for in循环和java里foreach循环的区别分析
Jan 28 Javascript
浅谈JavaScript异常处理语句
Jun 26 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
Aug 06 Javascript
js学习之----深入理解闭包
Nov 21 Javascript
jquery操作ID带有变量的节点实例
Dec 07 Javascript
angular中ui calendar的一些使用心得(推荐)
Nov 03 Javascript
浅谈Node框架接入ELK实践总结
Feb 22 Javascript
微信小程序实现发微博功能的示例代码
Jun 24 Javascript
浅谈Javascript如何实现匀速运动
Dec 19 #Javascript
Javascript添加监听与删除监听用法详解
Dec 19 #Javascript
Javascript 实现图片无缝滚动
Dec 19 #Javascript
使用JavaScript获取地址栏参数的方法
Dec 19 #Javascript
JS获取各种宽度、高度的简单介绍
Dec 19 #Javascript
JQuery右键菜单插件ContextMenu使用指南
Dec 19 #Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
Dec 19 #Javascript
You might like
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
php中过滤非法字符的具体实现
2013/10/29 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
原型方法的不同写法居然会影响调试的解决方法
2007/03/08 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
js读写json文件实例代码
2014/10/21 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
JS使用正则表达式验证身份证号码
2017/06/23 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
vue 全局环境切换问题
2019/10/27 Javascript
详细介绍Python语言中的按位运算符
2013/11/26 Python
详解python的webrtc库实现语音端点检测
2017/05/31 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
Python之变量类型和if判断方式
2020/05/05 Python
浅谈django不使用restframework自定义接口与使用的区别
2020/07/15 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
Django nginx配置实现过程详解
2020/09/10 Python
Python 使用office365邮箱的示例
2020/10/29 Python
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
生物化工工艺专业应届生求职信
2013/10/08 职场文书
医科大学生的自我评价
2013/12/04 职场文书
初一英语教学反思
2014/01/11 职场文书
运动会四百米广播稿
2014/01/19 职场文书
幼儿教师考核制度
2014/01/25 职场文书
妇女工作先进事迹
2014/08/17 职场文书
银行给客户的感谢信
2015/01/23 职场文书
农村老人去世追悼词
2015/06/23 职场文书
Redis Stream类型的使用详解
2021/11/11 Redis
使用python绘制分组对比柱状图
2022/04/21 Python