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

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

在这个系列的上一篇博客中原生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. 在ubuntu上安装运行ionic项目

    1.安装nodejs.npm curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - sudo apt-get install - ...

  2. MineSite

    country:http://s01.flagcounter.com/more/SoJN/

  3. windows7安装docker

    因为本机已经安装了git,所以这里取消勾选 配置环境变量 进入到D:\DockerToolbox 将D:\DockerToolbox下的boot2docker.iso 复制到C:\Users\my\. ...

  4. jenkins自动打包部署项目

    首先去jenkins的官网下载安装包 https://jenkins.io/   个人下载是长期稳定的那个版本,下载后,得到一个.msi的安装包: 点击进行安装,然后一直点击下一步. jenkins会 ...

  5. Apache POI - Java Excel APIs

    文档来源:https://www.yiibai.com/apache_poi/ POI 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显 ...

  6. js 函数声明和函数表达式的区别

    javascript中声明函数的方法有两种:函数声明和函数表达式. 区别如下: 1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的. 2).以函数声明的方法定义的函数,函数 ...

  7. 2019.4.1考试&2019.4.2考试&2019.4.4考试

    4.1:T1原题,T2码农板子题,T3板子题 4.2 好像是三个出题人分别出的 以及#define *** 傻逼 T1 思维好题 转成树形DP,$dp[i][j]$表示点i值为j的方案数,记录前缀和转 ...

  8. 洛谷P2704 炮兵阵地

    本题过于经典...... 对于这种网格状压DP,套路一波刷表法DFS转移就没了. 三进制状压,0表示当前,上一个都没有.1表示当前无,上一个有.2表示当前有. 转移的条件就是上一行为0,当前不是山地, ...

  9. 洛谷P5111 zhtobu3232的线段树

    题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...

  10. 【洛谷P1896】互不侵犯

    题目大意:给定 N*N 的棋盘,一共放 K 个国王,一共有多少种方法. 题解: i&i<<1 判断是否每个 1 的位置之间都有 0. i&j<<1 判断 i 中 ...