浅谈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函数map()和each()介绍及异同点分析
Nov 08 Javascript
angularjs学习笔记之完整的项目结构
Sep 26 Javascript
JS实现重新加载当前页面或者父页面的几种方法
Nov 30 Javascript
jQuery纵向导航菜单效果实现方法
Dec 19 Javascript
js和jquery中获取非行间样式
May 05 jQuery
为什么使用koa2搭建微信第三方公众平台的原因
May 16 Javascript
5分钟学会Vue动画效果(小结)
Jul 21 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
Sep 30 Javascript
JS实现的新闻列表自动滚动效果示例
Jan 30 Javascript
vue过滤器实现日期格式化的案例分析
Jul 02 Javascript
Vue中component标签解决项目组件化操作
Sep 04 Javascript
详解datagrid使用方法(重要)
Nov 06 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的安全策略
2006/10/09 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
2018/01/18 jQuery
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
基于JS实现快速读取TXT文件
2020/08/25 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
python之yield表达式学习
2014/09/02 Python
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
Python中subprocess的简单使用示例
2015/07/28 Python
Python测试模块doctest使用解析
2019/08/10 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
python 线程的五个状态
2020/09/22 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
python自动生成证件号的方法示例
2021/01/14 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
EJB的基本架构
2016/09/22 面试题
触摸春天教学反思
2014/02/03 职场文书
学生会竞选演讲稿
2014/04/24 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
节能减耗标语
2014/06/21 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL