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 速度取整 跟随页面滚动的缓冲侧边栏 潜在问题:目标值不是整数时 缓冲运动的停止条件 ...
随机推荐
- 标准库path源码解读
先看标准库 作用:关于路径的一些实用操作 https://github.com/golang/go/blob/master/src/path/path.go 源码地址 func IsAbs func ...
- 算法(C#版)动态规划和贪心算法
https://blog.csdn.net/kouzhuanjing1849/article/details/88954811
- 在SQL中存储过程的一般语法
一般分为十种情况,每种语法各不相同: 1. 创建语法 1 2 3 4 5 6 7 create proc | procedure pro_name [{@参数数据类型} [=默认值] [outp ...
- dom的节点操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SpringBoot 单元测试忽略@component注解
springboot框架在单元测试时可能需要忽略某些带有@component的实例 例如以下代码: @Component public class MyCommandLineRunner implem ...
- locale - 地域定义文件的描述
描述 地域 定义文件含有 localedef(1) 命令所需的全部信息. 定义文件由几个小节组成, 一个小节详细地描述地域的一个范畴. 语法 地域定义文件以一个包含有如下关键字的文件头开头: < ...
- 《Java核心技术卷I》——第5章 继承
在C++中,没有提供用于表示抽象类的特殊关键字.只要有一个纯虚函数,这个类就是抽象类. hashCode()方法是定义在Object类中,因此每个对象都有一个默认的散列码,其值为对象的存储地址. 绝大 ...
- java打印树形目录结构
import java.io.File; public class MainTest { public static void main(String[] args) { String dirname ...
- java 工具包
https://www.cnblogs.com/aligege/p/8521934.html https://gitee.com/loolly/hutool https://blog.csdn.net ...
- vue项目中打包background背景路径问题
项目中图片都放在src/img文件夹,img和background-image引用都用相对路径,即../../这种形式 在打包build的设置路径assetsPublicPath: ‘./‘,然后那些 ...