浅谈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 相关文章推荐
对google个性主页的拖拽效果的js的完整注释[转]
Apr 10 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
Dec 11 Javascript
利用JS解决ie6不支持max-width,max-height问题的方法
Jan 02 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
Mar 04 Javascript
浅析JS异步加载进度条
May 05 Javascript
Vue.js实战之组件的进阶
Apr 04 Javascript
JS实现十字坐标跟随鼠标效果
Dec 25 Javascript
vue中如何让子组件修改父组件数据
Jun 14 Javascript
微信小程序显示倒计时功能示例【测试可用】
Dec 03 Javascript
vue通信方式EventBus的实现代码详解
Jun 10 Javascript
js实现直播点击飘心效果
Aug 19 Javascript
Javascript之datagrid查询详解
Sep 15 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实现生成验证码实例分享
2016/04/10 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
JS实现商品倒计时实现代码
2013/05/03 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
jquery验证手机号是否正确实例讲解
2015/11/17 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
Android分包MultiDex策略详解
2017/10/30 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
python3使用flask编写注册post接口的方法
2018/12/28 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
python 使用shutil复制图片的例子
2019/12/13 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
新锐科技Java程序员面试题
2016/07/25 面试题
计算机专业毕业生自荐信范文
2014/03/06 职场文书
学校督导评估方案
2014/06/10 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
技术负责人岗位职责
2015/02/10 职场文书
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS
浅谈Redis的keys命令到底有多慢
2021/10/05 Redis