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

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

在这个系列的上一篇博客中原生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. MT【189】二次条件配方

    “当一幢建筑物完成时,应该把脚手架拆除干净.”——高斯 (2017北大特优)若对任意使得关于 \(x\) 的方程 \(ax^2+bx+c=0\)(\(ac\ne 0\))有实数解的 \(a,b,c\) ...

  2. 牛客网noip集训4

    T1 (A)[https://www.nowcoder.com/acm/contest/175/A] 给出 l, r, k,请从小到大输出所有在 [l, r] 范围内,能表示为 k 的非负整数次方的所 ...

  3. Hdoj 1232.畅通工程 题解

    Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通 ...

  4. python 去重

    List: listA = ['python','python','言','是','一','门','动','态','语','言'] print sorted(set(listA), key = lis ...

  5. centos7/centos6修改系统默认语言

    应用环境: 一直在使用centos7.x,系统默认的语言也是英文环境,工作内容偶遇中文,顺便搜罗修改一番,小记如下. 测试环境: 测试步骤: CentOS 7.x 1. 查看当前语言环境 [root@ ...

  6. Python学习day1 初识python&环境安装

    day1 环境安装-计算机基础 环境安装参见 https://blog.csdn.net/ling_mochen/article/details/79314118 1.markdown基本语法 htt ...

  7. A1144. The Missing Number

    Given N integers, you are supposed to find the smallest positive integer that is NOT in the given li ...

  8. B1016. 部分A+B

    正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6. 现给定A.DA.B.DB,请编 ...

  9. C/C++ 动态存储分配 malloc calloc realloc函数的用法与区别

    C++内存分配 https://blog.csdn.net/zhangxiao93/article/details/43966425

  10. semantic ui框架学习笔记二

    评论组件 文档里的评论组件介绍的比较清晰.这里我就挑一个我喜欢的格式展示出来: <div class="ui comments"> <h3 class=" ...