浅谈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 相关文章推荐
iframe 自适应高度[在IE6 IE7 FF下测试通过]
Apr 13 Javascript
Ext 表单布局实例代码
Apr 30 Javascript
javascript 写类方式之六
Jul 05 Javascript
javascript下判断一个元素是否存在的代码
Mar 05 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
May 05 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
Jan 13 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
Feb 07 Javascript
JavaScript实现滑动导航栏效果
Aug 30 Javascript
实例详解vue中的$root和$parent
Apr 29 Javascript
详解vue 在移动端体验上的优化解决方案
May 20 Javascript
ES6中Symbol、Set和Map用法详解
Aug 20 Javascript
uni-app如何页面传参数的几种方法总结
Apr 28 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生成excel列序号代码实例
2013/12/24 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
php魔术变量用法实例详解
2014/11/13 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
浅谈jQuery中hide和fadeOut的区别 show和fadeIn的区别
2016/08/18 Javascript
jQuery中show与hide方法用法示例
2016/09/16 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
linux 下以二进制的方式安装 nodejs
2020/02/12 NodeJs
js+canvas实现画板功能
2020/09/13 Javascript
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python如何实现excel数据添加到mongodb
2015/07/30 Python
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
python实现简单的文字识别
2018/11/27 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
百丽国际旗下购物网站:优购
2017/02/28 全球购物
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
2012/05/30 面试题
个人自我鉴定
2013/11/07 职场文书
车间主任岗位职责
2014/03/16 职场文书
工作总结与自我评价
2014/09/18 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python