浅谈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 相关文章推荐
Tinymce+jQuery.Validation使用产生的BUG
Mar 29 Javascript
js里的prototype使用示例
Nov 19 Javascript
jquery提交form表单时禁止重复提交的方法
Feb 13 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
Feb 21 Javascript
js简单实现交换Li的值
May 22 Javascript
Javascript常用字符串判断函数代码分享
Dec 08 Javascript
js实现的星星评分功能函数
Dec 09 Javascript
聊一聊JS中的prototype
Sep 29 Javascript
JS中with的替代方法与String中的正则方法详解
Dec 23 Javascript
微信小程序中页面FOR循环和嵌套循环
Jun 21 Javascript
vue中axios的二次封装实例讲解
Oct 14 Javascript
javascript的var与let,const之间的区别详解
Feb 18 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
一个用于网络的工具函数库
2006/10/09 PHP
php递归调用删除数组空值元素的方法
2015/04/28 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
ext form 表单提交数据的方法小结
2008/08/08 Javascript
页面中body onload 和 window.onload 冲突的问题的解决
2009/07/01 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
javascript插入样式实现代码
2012/02/22 Javascript
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
Document.location.href和.replace的区别示例介绍
2014/03/04 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
vue实现登陆登出的实现示例
2017/09/15 Javascript
详解js模板引擎art template数组渲染的方法
2018/10/09 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
Python实现进程同步和通信的方法
2018/01/02 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
Python使用Matlab命令过程解析
2020/06/04 Python
keras 多gpu并行运行案例
2020/06/10 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
傲盾软件面试题
2015/08/17 面试题
研修第一天随笔感言
2014/02/15 职场文书
党委班子对照检查材料
2014/08/19 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
地震慰问信
2015/02/14 职场文书
如何利用golang运用mysql数据库
2022/03/13 Golang