原文:Javascript 匀速运动停止条件——逐行分析代码,让你轻松了运动的原理

我们先来看下之前的匀速运动的代码,修改了速度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

那为什么会出现这种情况呢 ?

实际上来说他到达目标点的时候无法精确到目标点,若目标点是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 匀速运动停止条件——逐行分析代码,让你轻松了运动的原理相关推荐

  1. Javascript 拖拽的一些高级的应用——逐行分析代码,让你轻松了解拖拽的原理...

    我们看看之前的拖拽在周围有东西的时候会出现什么问题? 在高级浏览器中不会有啥问题,我们放到IE7下面测试一下,问题就出来了.如图 我们可以很清楚的看到,文字都已经被选中了.那这个用户体验很不好,用起来 ...

  2. Javascript 链式运动框架——逐行分析代码,让你轻松了解运动的原理

    所谓链式运动,就是一环扣一环.我们的很多运动实际上来说指的就是分阶段的,第一个阶段动完,下个阶段开始动. 这个链式运动框架就是用来处理这些问题的. 我们先来看下之前的运动框架,以下是Javascrip ...

  3. 逐行分析鸿蒙系统的 JavaScript 开发框架

    近日,鸿蒙终于发布了,开发者们也着实"沸腾"了.笔者也第一时间下载了源码,研究了一个晚上,顺带写了一个 hello world 程序,还顺手给鸿蒙文档提了 2 个 PR. 当然我最 ...

  4. 进阶篇---PPO代码逐行分析

    进阶篇-PPO代码逐行分析 一.TRPO.PPO.DPPO PG (Policy gradient) 最常用的策略梯度估计其表达形式如下 TRPO(Trust Region Policy Optimi ...

  5. 并发编程——ConcurrentHashMap#transfer() 扩容逐行分析

    并发编程--ConcurrentHashMap#transfer() 扩容逐行分析 </h1><div class="clear"></div> ...

  6. JavaScript跨域问题分析与总结_直来直往_百度空间

    JavaScript跨域问题分析与总结_直来直往_百度空间 JavaScript跨域问题分析与总结 2009-11-15 16:44 一.为什么需要JS跨域 假设我们构建了一个网上商城www.xxx. ...

  7. Python性能分析入门——cProfile、可视化、逐行分析、内存分析

    文章目录 简介 cProfile PyCharm 可视化 安装 gprof2dot SnakeViz PyCallGraph 逐行分析 内存分析 内存堆分析 其他 遇到的坑 参考文献 简介 通过性能分 ...

  8. JavaScript奇技淫巧:加密JS代码反调试

    JavaScript奇技淫巧:加密JS代码反调试 JS代码混淆加密,已被很多人使用,因为它真的很有用.很实用,可以用于保护代码.防护分析.复制.盗用,还可以用于小游戏过审.APP加固等方面. 混淆加密 ...

  9. ReSharper智能插件,ReSharper分析代码质量

    ReSharper智能插件,ReSharper分析代码质量 ReSharper 是 Visual Studio 的智能插件.它配备了一组丰富的功能,包括智能编码辅助.即时错误突出显示和快速纠错.ReS ...

最新文章

  1. 软件是计算机什么及相关文档的总称,1冯-诺依曼原理的基本思想是什么.doc
  2. Java代码缺陷自动分析工具介绍
  3. typescript在ES3(IE7)环境下使用async、await
  4. 防止Visual C++应用程序缓冲区溢出
  5. 用hibernate类实现数据库的基本操作
  6. e-mobile帐号状态存在异常_Java 常见异常种类
  7. linux memcpy 效率,memcpy每秒字节速率
  8. 2019物联网发展十大预测,你准备好了吗?
  9. directX9SDK中提取的9个DLL文件
  10. 第三章 硅谷宠儿 Friendster (一)
  11. IT服务器台账系统,it项目管理信息系统
  12. 【ubuntu如何录制gif图】
  13. matlab流体力学分析,matlab流体力学
  14. The user specified as a definer (‘skip-grants user‘@‘skip-grants host‘) does not exist
  15. 基于钉钉的多人协作项目办公
  16. 《30岁前每一天》 读书心得体会
  17. C++面试之Linux操作系统
  18. 如何进行小红书推广?小红书平台适合推广什么产品?
  19. acm水仙花数java,水仙花数之C语言经典案例分析
  20. 美国的米拉超级计算机,超级计算机“米拉”:效力阿贡国家实验室_Intel Xeon E5-4650_服务器评测与技术-中关村在线...

热门文章

  1. 《深度学习革命》作者:GAN令我惊艳,现在的人们对AI操之过急了
  2. SAP Batch Management 批次主数据中classification视图中GR Date没有被更新?
  3. 免费教材丨第52期:人工智能(复杂问题求解的结构和策略)、人工智能哲学
  4. 深入理解IPyton以及Jupyter Notebook中的%time以及%timeit的作用
  5. 什么是Attention机制以及Pytorch如何使用
  6. 《Nature》:衰老后的核糖体发生了哪些致病变化
  7. RISC-V会被卡吗?那么你觉得C语言会不会被卡? | 包云岗
  8. Gartner发布2020年数据与分析领域的十大技术趋势
  9. Nature好文:过去150年,科学与产业经历四段情缘!
  10. 如何评价马云和马斯克在世界人工智能大会的对话?