Javascript 学习笔记 缓冲运动——逐行分析代码,让你轻松了解缓冲运动的原理

看过上一篇关于Javascript 匀速运动文章的朋友相信对于运动已经有了初步的了解

接下来 讲一下关于缓冲运动的原理 ,我会逐行分析代码,代码简单易懂,能马上理解其中的原理,适用于初学者。

#div1 {
                width: 100px;
                height: 100px;
                position: absolute;
                background: red;
                top: 50px;
                left: 0; /*600 初始值*/
            }
            #div2 {
                width: 1px;
                height: 300px;
                position: absolute;
                left: 300px;
                top: 0;
                background: black;
            }
<body>
        <input type="button" id="btn" value="开始运动" onclick="startMove()" />

        <div id="div1">

        </div>
        <div id="div2">

        </div>
    </body>

以下是Javascript 代码

<script type="text/javascript">

            function startMove() {
                var oDiv = document.getElementById("div1");
                setInterval(function() {
                    var speed = (300 - oDiv.offsetLeft) / 10;

                    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

                    oDiv.style.left = oDiv.offsetLeft + speed + ‘px‘;

                }, 30)
            }
        </script>

这短短的几行代码,让我们看看其中有些什么原理,为何是这样写,实现缓冲运动。

原理:

当物体和终点之间的距离大的时候 速度是大的  距离不断的减小,速度也不断的减小

也就是说 速度与距离成正比 这样就是缓冲运动的原理。

代码分析:

var speed = (300 - oDiv.offsetLeft) / 10;  300 是自己定义的目标点 , 也就是div1 要运动到哪个地方

这里为什么要除以10呢 ?  因为 当物体的offsetLeft 为0 的时候 ,300-0=0   speed=300;

这样运动会直接到达目标点,而没有了中间的过程。 本质的问题其实就是速度太大太快了,一下就到了终点。

解决方案:除以10, 这样速度就变小了,就有了中间的过程。 那随着距离的越来越小 速度也就越来越小 达到缓冲的效果。

若分母越小 速度越大 ,控制速度 去改变分母即可。

speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

此时 除出来会有小数的情况 大家知道在css中 290.5px =290px , 299.9px = 299px 像素会舍去小数部分

所以他运动到最后不会达到目标点 这样就会出现了bug ,附上图

可以看到div2 作为一个标杆 物体并没有运动到底。

解决方案: 就要取整。

当div往右动, speed 为正 就ceil() , 若div的初始位置为600,那就是在向左走 , 此时speed是负值

若算出来speed=-0.9  在ceil() 一下 那就是变成0了 ,就会出问题  所以要floor,向下取整

最后结合起来判断speed 的正负 来调用不同的取整方式。 这套程序就可以 既往右边 又往左边运动。

总结:

往右边移动 就向上取整 / 左边就向下取整

用缓冲运动一定要取整,否则就会出bug

最后的效果

时间: 2024-10-10 04:35:03

Javascript 学习笔记 缓冲运动——逐行分析代码,让你轻松了解缓冲运动的原理的相关文章

Javascript 多物体运动——逐行分析代码,让你轻松了运动的原理

我们先来看下之前的运动的代码,是否支持多物体运动,会出现怎么样的问题. <style type="text/css"> div { width: 100px; height: 50px; background: red; margin: 10px; } </style> <body> <div></div> <div></div> <div></div> </body>

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

原文:Javascript 匀速运动停止条件--逐行分析代码,让你轻松了运动的原理 我们先来看下之前的匀速运动的代码,修改了速度speed后会出现怎么样的一个bug.这里加了两个标杆用于测试 <style type="text/css"> #div1 { width: 100px; height: 100px; position: absolute; background: red; top: 50px; left: 600px; } #div2 { width: 1px;

javascript学习笔记---ECMAScript运算符(位运算符)

位运算符是在数字底层(即表示数字的 32 个数位)进行操作的. 位运算 NOT 位运算 NOT 由否定号(~)表示,它是 ECMAScript 中为数不多的与二进制算术有关的运算符之一. 位运算 NOT 是三步的处理过程: 把运算数转换成 32 位数字 把二进制数转换成它的二进制反码 把二进制数转换成浮点数 例如: var iNum1 = 25; //25 等于 00000000000000000000000000011001 var iNum2 = ~iNum1; //转换为 11111111

Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript学习笔记(3--this/call/apply) Java程序猿的JavaScript学习笔记(4--this/闭包/getter/setter) Java程序猿的JavaScript学习笔记(5--prototype) Java程序猿的JavaScript学习笔记(6--面向对象模拟) Java程

javascript学习笔记---ECMAScript语法(引用类型)

引用类型通常叫做类(class). 本教程会讨论大量的 ECMAScript 预定义引用类型. 引用类型 引用类型通常叫做类(class),也就是说,遇到引用值,所处理的就是对象. 本教程会讨论大量的 ECMAScript 预定义引用类型. 从现在起,将重点讨论与已经讨论过的原始类型紧密相关的引用类型. 注意:从传统意义上来说,ECMAScript 并不真正具有类.事实上,除了说明不存在类,在 ECMA-262 中根本没有出现"类"这个词.ECMAScript 定义了"对象定

javascript学习笔记---ECMAScriptECMAScript 对象----定义类或对象

使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象. ECMAScript 拥有很多创建对象或类的方法. 原始的方式 因为对象的属性可以在对象创建后动态定义(后绑定),类似下面的代码: var oCar = new Object; oCar.color = "blue"; oCar.doors = 4; oCar.mpg = 25; oCar.showColor = function() { alert(this.color); };不过这里有一

javascript学习笔记---ECMAScriptECMAScript 对象----修改对象

通过使用 ECMAScript,不仅可以创建对象,还可以修改已有对象的行为. prototype 属性不仅可以定义构造函数的属性和方法,还可以为本地对象添加属性和方法. 创建新方法 通过已有的方法创建新方法Number.prototype.toHexString = function() { return this.toString(16); }; 在此环境中,关键字 this 指向 Number 的实例,因此可完全访问 Number 的所有方法.有了这段代码,可实现下面的操作: var iNu

javascript学习笔记——如何修改&lt;a href=&quot;#&quot;&gt;url name&lt;/a&gt;

0.前言 使用了一段时间javascript,再花了点时间学习了jquery,但是总是感觉自己很"迷糊",例如<a href="#">url name</a>中,如果修改href中的"#"应如何编写代码,如果修改url name应如何编写代码.再加上javascript和jquery操作方法略有不同,所以我就更"迷糊"了. [说明] 曾经使用关键词--"innerHTML和value区别&qu

javascript学习笔记---ECMAScript语法(辅助)

1.区分大小写. test与Test变量是两个不同的变量 2.变量是弱变量. 与C,java等等语言变量不是很一样. 如下java代码 ? 1 2 3 4 int i =0; //再次赋值 i = 10;//ok i = "hello";//wrong 类型不匹配 javascript ? 1 2 3 4 var i = 9; //再次赋值 i = 10;//ok i = "hello";//ok 但是不建议这么干,如此会给开发造成干扰,不明确变量的类型.(变量命名