原生JavaScript运动功能系列(二):缓冲运动
- 匀速运动实现回顾
- 缓冲运动剖析
- 示例实现
- 方法提取
匀速运动实现回顾及缓冲运动剖析:
在这个系列的上一篇博客中原生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运动功能系列(二):缓冲运动的更多相关文章
- 原生JavaScript运动功能系列(五):定时定点运动
原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现 原生JavaScript运动功能系列(二):缓冲运动 原生JavaScript运动功能系列(三):多物体多值运动 原生JavaS ...
- 原生JavaScript运动功能系列(四):多物体多值链式运动
原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现 原生JavaScript运动功能系列(二):缓冲运动 原生JavaScript运动功能系列(三):多物体多值运动 多物体多值链式 ...
- 原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现
在我们日常生活中运动就是必不可少的部分,走路.跑步.打篮球等.在网页交互设计上运动也是必不可少的部分,创建的网站交互设计运动模块有轮播图,下拉菜单,还有各种炫酷的游戏效果都跟运动密切相关.所以很重要, ...
- 原生JavaScript运动功能系列(三):多物体多值运动
多物体同时出发运动函数实现 多属性同步运动变化实现 一.多物同时触发运动函数实现 前面两个动画示例基本理解了动画的核心:位置变化和速度变化,操作的核心就是定时器分段叠加属性值.但是动画还是基于单个元素 ...
- javascript类继承系列二(原型链)
原型链是采用最主要的继承方式,原理:每一个类(构造器,js中的function)都有一个原型属性(prototype)指向一个原型对象,原型对象有一个构造器(constructor),它又指回到fun ...
- javascript运动系列第五篇——缓冲运动和弹性运动
× 目录 [1]缓冲运动 [2]弹性运动 [3]距离分析[4]步长分析[5]弹性过界[6]弹性菜单[7]弹性拖拽 前面的话 缓冲运动指的是减速运动,减速到0的时候,元素正好停在目标点.而弹性运动同样是 ...
- javascript每日一练(十)——运动二:缓冲运动
一.缓冲运动 实现原理:(目标距离-当前距离) / 基数 = 速度(运动距离越大速度越小,运动距离和速度成反比) (500 - oDiv.offsetLeft) / 7 = iSpeed; 需要注意: ...
- javascript学习-原生javascript的小特效(简单的运动效果)
前些日子看了个视频所以就模仿它的技术来为大家做出几个简单的JS小特效 一:运动特效(主要是通过改变元素的left,right,height,width,opacity来达到运动的效果) 我们今天做一个 ...
- 原生javascript写自己的运动库(匀速运动篇)
网上有很多JavaScript的运动库,这里和大家分享一下用原生JavaScript一步一步写一个运动函数的过程,如读者有更好的建议欢迎联系作者帮助优化完善代码.这个运动函数完成后,就可以用这个运动函 ...
随机推荐
- sublime3添加verilog自动补全代码段
前言 sublime默认的verilog自动补全十分垃圾,不过提供了代码段这个功能,你可以自己写个重用率高的代码段减轻工作量.写个模板当tb也很爽啦. 流程 1.打开user文件夹,创建verilog ...
- 【XSY1552】自动机 构造
题目大意 给你一个自动机,包含\(n\)个状态,指令集为前\(m\)个小写字母,对于每个状态\(s\)和每个指令\(i\),自动机均有后继\(T(s,i)\).请你求出一个长度不超过\(2^{20}\ ...
- 如何判断是否为同一个App,Ionic3如何修改包名
如何判断是否同一个App 使用Ionic3创建了两个项目demo1.demo2,然后使用同一个JDK,生成了两个不同的keystore证书. 结果在手机端安装的时候,先安装demo1,没有任何替换的提 ...
- github Permission denied (publickey). fatal: Could not read from remote repository.
github Permission denied (publickey).fatal: Could not read from remote repository. ----------------- ...
- 可前端解密的加密方法探讨和str_replace和preg_replace分析
目的: 对字符串‘123456’进行后端加密,前端js可解密出真实字符 测试代码php: static $hashMap = array( '0' => '4', '1' => '9', ...
- JS基本类型-引用类型-深浅拷贝
在JavaScript中变量包含两种类型的值:一种是基本类型,一种是引用类型. 基本类型包括:数值.字符串.null.undefined.布尔值引用类型包括:对象.数组.函数.正则… 补充: null ...
- 【mysql】mysql null值
在数据表我们有时候有些表字段会为null,表示空.其实在mysql中null值是占用空间的. mysql手册如下解释 NULL columns require additional space in ...
- Yii2 如何输出 sql 语句?
可以用 $model->find()->createCommand()->getRawSql(); 不能带 all(). find() 它的 返回值类型是 yii\db\Active ...
- Pandas库中的DataFrame
1 简介 DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表. 或许说它可能有点像matlab的矩阵,但是matlab的矩阵只能放数值型值(当然matla ...
- JS 判断各种设备,各种浏览器
话不多说,直接看代码 1.区分Android.iphone.ipad: var ua = navigator.userAgent.toLowerCase(); if (/android|adr/gi. ...