浅谈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 相关文章推荐
jQuery生成asp.net服务器控件的代码
Feb 04 Javascript
不要在cookie中使用特殊字符的原因分析
Jul 13 Javascript
JS日期和时间选择控件升级版(自写)
Aug 02 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
Sep 21 Javascript
JQuery实现动态添加删除评论的方法
May 18 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
Jun 03 Javascript
JavaScript必知必会(六) delete in instanceof
Jun 08 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
Jul 18 Javascript
vue短信验证性能优化如何写入localstorage中
Apr 25 Javascript
JS执行控制之节流模式实例分析
Dec 21 Javascript
JavaScript实现shuffle数组洗牌操作示例
Jan 03 Javascript
如何利用node转发请求详解
Sep 17 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
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
零基础学JavaScript最新动画教程+iso光盘下载
2008/01/22 Javascript
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
2012/03/14 Javascript
javascript的console.log()用法小结
2012/05/31 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
js控制table合并具体实现
2014/02/20 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
微信小程序 自定义对话框实例详解
2017/01/20 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
解决vue点击控制单个样式的问题
2018/09/05 Javascript
js常用正则表达式集锦
2019/05/17 Javascript
js表达式与运算符简单操作示例
2020/02/15 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
Python中的with...as用法介绍
2015/05/28 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
电子商务应届生求职信
2013/11/16 职场文书
研发工程师的岗位职责
2013/11/18 职场文书
大专生的学习自我评价
2013/12/04 职场文书
毕业自荐信
2013/12/16 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
公路施工安全责任书
2015/05/08 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
python urllib库的使用详解
2021/04/13 Python
MySQL表字段时间设置默认值
2021/05/13 MySQL
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis