day41—JavaScript运动的停止条件
转行学开发,代码100天——2018-04-26
前面学过了JavaScript运动的两种常用情形:匀速运动与缓冲运动。在这两种运动的处理过程中最大的区别在于速度的处理和到达目标点的处理。
即本文需要学习和记录的JavaScript运动的停止条件问题。
1.匀速运动的停止条件
匀速运动框架:
var timer = null;
function startMove(iTarget)
{
var oDiv = document.getElementById("div1");
clearInterval(timer);
var speed=0; timer = setInterval(function(){
if (oDiv.offsetLeft<iTarget) {
speed = 7;
}else
{
speed=-7;
}
oDiv.style.left = oDiv.offsetLeft+speed+"px";
},300);
}

假设让图中红色物体匀速移动到左100位置和左300位置。
<input id="btn1" type="button" value="到100" onclick="startMove(100);">
<input id="btn2" type="button" value="到300" onclick="startMove(300);">
<div id="div1"> </div>
<div id="div2"> </div>
<div id="div3"> </div>
<style type="text/css">
#div1{width: 100px;height: 100px ;position: absolute;top: 50px;left: 400px;background: red;}
#div2{width: 1px;height: 100px ;position: absolute;top: 50px;left: 100px;background: black;}
#div3{width: 1px;height: 100px ;position: absolute;top: 50px;left: 300px;background: black;}
</style>
执行后发现物体在目标点位置附近来回移动,无法停止。
究其原因,可以发现加上速度±7之后,使物体总是在目标点附近,多一步就超了,少一步就不足。
这时,按照绝对要求是没法很好解决的。因此我们采用一个折中的办法。即在目标点附近,可以默认到达。
这时我们就需要一个在目标位置附近的判断,用到一个数学中的绝对值方法,Math.abs();
完善后的匀速运动框架:
var timer = null;
function startMove(iTarget)
{
var oDiv = document.getElementById("div1");
clearInterval(timer);
var speed=0; timer = setInterval(function(){
if (oDiv.offsetLeft<iTarget) {
speed = 7;
}else
{
speed=-7;
}
if (Math.abs(oDiv.offsetLeft-iTarget)<=7) {
oDiv.style.left = iTarget+"px";
}else
{
oDiv.style.left = oDiv.offsetLeft+speed+"px";
}
},300);
}
执行后发现,基本达到预期效果(肉眼看不出的小处理效果)

2.缓冲运动的停止条件
在缓冲运动中,由于速度变化可调,只需要物体缓冲运动的最终位置为目标位置即可停止。
详情可见缓冲运动的学习笔记:
正常执行缓冲运动框架即可。这里需要特别注意以下几点:
1>速度必须取整,方法是Math.ceil()向上取整;Math.floor()向下取整。
2>目标点必须是整像素点。方法是parseInt();
day41—JavaScript运动的停止条件的更多相关文章
- 原生JavaScript运动功能系列(五):定时定点运动
原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现 原生JavaScript运动功能系列(二):缓冲运动 原生JavaScript运动功能系列(三):多物体多值运动 原生JavaS ...
- javascript运动系列第一篇——匀速运动
× 目录 [1]简单运动 [2]定时器管理 [3]分享到效果[4]移入移出[5]运动函数[6]透明度[7]多值[8]多物体[9]回调[10]函数完善[11]最终函数 前面的话 除了拖拽以外,运动也是j ...
- Popmotion – 小巧,灵活的 JavaScript 运动引擎
Popmotion 是一个只有12KB的 JavaScript 运动引擎,可以用来实现动画,物理效果和输入跟踪.原生的DOM支持:CSS,SVG,SVG路径和DOM属性的支持,开箱即用.Popmoti ...
- javascript运动框架(三)
迟到了好几天,不好意思哈!继续来优化一下javascript运动框架的代码.之前的代码存在bug,当重复点击时速度会加快,那么怎么解决这个bug呢? 现在我们就来解决一下,其实很简单,在开始运动时,关 ...
- 好程序员技术教程分享JavaScript运动框架
好程序员技术教程分享JavaScript运动框架,有需要的朋友可以参考下. JavaScript的运动,即让某元素的某些属性由一个值变到另一个值的过程.如让div的width属性由200px变到400 ...
- 原生JavaScript运动功能系列(四):多物体多值链式运动
原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现 原生JavaScript运动功能系列(二):缓冲运动 原生JavaScript运动功能系列(三):多物体多值运动 多物体多值链式 ...
- 原生JavaScript运动功能系列(二):缓冲运动
匀速运动实现回顾 缓冲运动剖析 示例实现 方法提取 匀速运动实现回顾及缓冲运动剖析: 在这个系列的上一篇博客中原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现就运动的核心功能组成 ...
- 【repost】JavaScript运动框架之速度时间版本
一.JavaScript运动框架之速度版 1.1 运动框架的实现思路 运动,其实就是在一段时间内改变 left . right . width . height . opactiy 的值,到达目的地之 ...
- javaScript运动框架之缓冲运动
缓冲运动 逐渐变慢,最后停止 距离越远速度越大 速度由距离决定 速度=(目标值-当前值)/缩放系数 存在Bug 速度取整 跟随页面滚动的缓冲侧边栏 潜在问题:目标值不是整数时 缓冲运动的停止条件 ...
随机推荐
- link标签中rel属性的作用
Link标签有两个作用:1. 定义文档与外部资源的关系:2. 是链接样式表.link标签是用于当前文档引用外部文档的 这个标签的rel属性用于设置对象和链接目标间的关系,说白了就是指明你链进来的对象是 ...
- js中的Math对象
绝对值Math.abs() console.log(Math.abs(-25)); console.log(Math.abs('-25'));//存在隐式转换可以求绝对值 co ...
- MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码
先来张在路上…… 铛铛铛……项目源码下载地址:http://files.cnblogs.com/ontheroad_lee/MongoDBDemo.rar 此项目是用Maven创建的,没有使用Mave ...
- JAVA中关于日期的最常见的操作
//获取当前系统的时间戳 long times = System.currentTimeMillis(); //创建一个当前日期对象 Date now = new Date(); //基于指定的时间戳 ...
- 116-基于5VLX110T FPGA FMC接口功能验证6U CPCI平台 光纤PCIe卡
基于5VLX110T FPGA FMC接口功能验证6U CPCI平台 一.板卡概述 本板卡是Xilinx公司芯片V5系列芯片设计信号处理板卡.由一片Xilinx公司的XC5VLX110T-1FF113 ...
- Codeforces Round #567 (Div. 2)B. Split a Number (字符串,贪心)
B. Split a Number time limit per test2 seconds memory limit per test512 megabytes inputstandard inpu ...
- MixConv
深度分离卷积一般使用的是3*3的卷积核,这篇论文在深度分离卷积时使用了多种卷积核,并验证了其有效性 1.大的卷积核能提高模型的准确性,但也不是越大越好.如下,k=9时,精度逐渐降低 2. mixCon ...
- 费用流+SPFA ||Luogu P3381【模板】最小费用最大流
题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...
- pandas处理字符串
# pandas 字符串的处理 # 前面已经学习了字符串的处理函数 # df["bWendu"].str.replace("℃","").a ...
- java File获取字节流
/*文件64位编码*/ public static void main(String[] args) { byte[] fileByte = toByteArray(newFile); String ...