• 匀速运动实现回顾
  • 缓冲运动剖析
  • 示例实现
  • 方法提取

匀速运动实现回顾及缓冲运动剖析:

在这个系列的上一篇博客中原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现就运动的核心功能组成,还剖析了匀速运动的实现,提取匀速运动的封装方法。这里我们回顾一下在匀速运动中存在三个核心逻辑:1.当最后的间距小于单位移动距离时,直接将位置移动到终点,并结束定时器执行;2.每次启动运动算法函数时,结束以前启动的定时器,防止重复启动运动算法函数出现定时器叠加;3.运动速度要设置正负值,保证正反双向都可以实现匀速运动(这一点在前一篇博客中没有提到)。

缓冲运动的特点

  • 运动速度逐渐递减
  • 其他特点与匀速运动算法基本一致

我想大家都有折纸的经历,小时候缺乏玩具的我们,各种折纸游戏和玩饰都是快乐的记忆,但是这里我不是要跟大家讨论折纸游戏和玩具的,如果大家有兴趣可以组个群玩。这里我要跟大家将的是,假设有一张纸,我们每对折一次,都会让边长减半,也就意味着每一次对折边长缩短的长度相比上一次就也是减半,直到纸折不动这个过程,边长缩减速度逐渐递减。这里就可以得到一个公式:边长/2=折叠后的边长;

有了折纸这个思路,聪明的你是否有了解决缓冲运动速度的计算方法呢?这里先提供HTML和CSS样式:

//html
<div></div>
<span></span>
<button id="bit">run</button> //css
div{
position: absolute;
/* left: 0px; */
left: 600px;/* 同样适用 */
top: 0px;
width: 100px;
height: 100px;
background: red;
}
span{
position: absolute;
left: 300px;
top: 1px;
width: 1px;
height: 100px;
background-color: #000;
}
button{
margin-top: 150px;
height: 25px;
width: 35px;
}
  • 公式:距离/sum = 单次运动距离
  • 代码实现:iSpeed = (target - dom.offsetLeft )/sum;
timer = setInterval(function (){
iSpeed = (300-obj.offsetLeft)/7;
//实现物体运动代码...
}

缓冲运动示例实现:

实现缓冲运动需要注意的几个计算陷阱:1.单次运动值小数陷阱;2.js操作像素添加小数值,但实际在渲染中只取整数部分;3.虽然通过终点位置减去当前位置可以自然实现正负值来控制运动方向,但因为前面两个原因,所以正向运动时要向上取整,反之则向下取整。

  • 向上取整:Math.ceil(...)
  • 向下取整:Math.floor(...)
 var oDiv=document.getElementsByTagName("div")[0];
var oBut=document.getElementById("bit");
var timer=null;
oBut.onclick=function(){
startMove(oDiv);
}
function startMove(obj){
clearInterval(timer);
var iSpeed;
timer = setInterval(function (){
iSpeed = (300-obj.offsetLeft)/7;
//console.log(iSpeed+"..."+Math.ceil(iSpeed));
iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
if(obj.offsetLeft === 300){
clearInterval(timer);
}else{
obj.style.left=obj.offsetLeft+iSpeed+'px';
}
},30);
}

缓冲运动方法提取:

参数:要运动的元素,运动到指定位置,计算运动速度的因素;

注意1:需要在调用方法的作用域上声明timer变量;

注意2:示例代码指定位置只有距离浏览器左侧的距离,如果是复杂的运动功能,可以将target封装成一个位置对象,还包括距离浏览器上边距、元素的大小,元素的透明度;

注意3:计算运动的因素不能取0或1;示例代码取7,测试效果最好适应范围在运动距离的40分之一到50分子一之间比较合适。

 function startMove(dom,target,divisor){
clearInterval(timer);
var iSpeed;
timer = setInterval(function (){
iSpeed = (target-dom.offsetLeft)/divisor;
iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
if(dom.offsetLeft === target){
clearInterval(timer);
}else{
dom.style.left=dom.offsetLeft+iSpeed+'px';
}
},30);
}

下一篇运动系列博客针对多物体多值联动效果剖析。

原生JavaScript运动功能系列(二):缓冲运动的更多相关文章

  1. 原生JavaScript运动功能系列(五):定时定点运动

    原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现 原生JavaScript运动功能系列(二):缓冲运动 原生JavaScript运动功能系列(三):多物体多值运动 原生JavaS ...

  2. 原生JavaScript运动功能系列(四):多物体多值链式运动

    原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现 原生JavaScript运动功能系列(二):缓冲运动 原生JavaScript运动功能系列(三):多物体多值运动 多物体多值链式 ...

  3. 原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现

    在我们日常生活中运动就是必不可少的部分,走路.跑步.打篮球等.在网页交互设计上运动也是必不可少的部分,创建的网站交互设计运动模块有轮播图,下拉菜单,还有各种炫酷的游戏效果都跟运动密切相关.所以很重要, ...

  4. 原生JavaScript运动功能系列(三):多物体多值运动

    多物体同时出发运动函数实现 多属性同步运动变化实现 一.多物同时触发运动函数实现 前面两个动画示例基本理解了动画的核心:位置变化和速度变化,操作的核心就是定时器分段叠加属性值.但是动画还是基于单个元素 ...

  5. javascript类继承系列二(原型链)

    原型链是采用最主要的继承方式,原理:每一个类(构造器,js中的function)都有一个原型属性(prototype)指向一个原型对象,原型对象有一个构造器(constructor),它又指回到fun ...

  6. javascript运动系列第五篇——缓冲运动和弹性运动

    × 目录 [1]缓冲运动 [2]弹性运动 [3]距离分析[4]步长分析[5]弹性过界[6]弹性菜单[7]弹性拖拽 前面的话 缓冲运动指的是减速运动,减速到0的时候,元素正好停在目标点.而弹性运动同样是 ...

  7. javascript每日一练(十)——运动二:缓冲运动

    一.缓冲运动 实现原理:(目标距离-当前距离) / 基数 = 速度(运动距离越大速度越小,运动距离和速度成反比) (500 - oDiv.offsetLeft) / 7 = iSpeed; 需要注意: ...

  8. javascript学习-原生javascript的小特效(简单的运动效果)

    前些日子看了个视频所以就模仿它的技术来为大家做出几个简单的JS小特效 一:运动特效(主要是通过改变元素的left,right,height,width,opacity来达到运动的效果) 我们今天做一个 ...

  9. 原生javascript写自己的运动库(匀速运动篇)

    网上有很多JavaScript的运动库,这里和大家分享一下用原生JavaScript一步一步写一个运动函数的过程,如读者有更好的建议欢迎联系作者帮助优化完善代码.这个运动函数完成后,就可以用这个运动函 ...

随机推荐

  1. 如何让自己定义的memory使用fpga自带的memory资源

    前言 本文解决方法来源: http://quartushelp.altera.com/13.1/mergedProjects/hdl/vlog/vlog_file_dir_ram.htm 如果你自己V ...

  2. (转)最短路径算法-Dijkstra算法分析及实践

    原地址:http://www.wutianqi.com/?p=1890 这篇博客写的非常简洁易懂,其中各个函数的定义也很清晰,配合图表很容易理解这里只选取了 其中一部分(插不来图片). Dijkstr ...

  3. thymeleaf中的判断总结

    判断String字符串,添加引号 th:class="${flag=='forum.html'}?'active'" 判断boolean类型,注意不能当成字符串处理,不能添加引号 ...

  4. Ionic的NavController 和ModalController 的区别

    网上也没有找到直接介绍两者区别的文章,以下都是个人感觉 区别 NavController 和 ModalController 都是打开新页面,但是NavController 是直接将页面放入到原有的页 ...

  5. day5 笔记

    笔记 字符格式化输出: 占位符%s s=string 字符型%d d=dight 整数型%f f=float 浮点数 约等于小数 通过格式:%(str1,str2,str3)一一对应 数据运算 数据类 ...

  6. IHttpHandler处理请求api

    使用IHttpHandler处理请求,实现webapi功能. 研究asp.net管道处理事件后,可用此法实现webapi功能. 测试环境 VS2017 WIN10 IIS10 集成模式 关键接口类两个 ...

  7. JS中的continue,break,return的区别

    关于continue.break.return的用法区别早在大一C语言学习中研究过,这里单独拿出来,总结一下. 还是来点实在的吧,上代码 <!DOCTYPE html PUBLIC " ...

  8. 学习笔记:fhq-treap

    0. 前置知识:\(treap\)的定义 树堆,在数据结构中也称Treap,是指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树. ​ >--摘自百度百科 形象化 ...

  9. 什么是Zookeeper?

    https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665514106&idx=1&sn=e54aae8cf68f5a ...

  10. Fiddler安装证书

    1.打开Fiddler,点击工具栏中的Tools——>Fiddler Options…       2.切换到 HTTPS 选项卡,勾选 Capture HTTPS CONNECTs,勾选 De ...