javascript匀速动画和缓冲动画详解


Posted in Javascript onOctober 20, 2016

关于网页中的动画,在css3中我们已经可以使用一些属性快速的做出来,但是有时候为了浏览器的兼容性我们还是需要使用js来制作网页中的动画。

使用js做动画最重要的一个函数就是setInterval函数,这里不再赘述,不懂可以直接百度用法。本文主要讲动画的原理已经在制作过程中的要点。

老规矩,先上代码,能直接看懂的可以节省时间。

html部分:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
  <meta charset="UTF-8"> 
  <title>move</title> 
  <link rel="stylesheet" href="move1.css"> 
</head> 
<body> 
  <input type="button" value="匀速移动" id="move1"> 
  <input type="button" value="渐变移动" id="move2"> 
  <div id="box1" class="box"></div> 
  <div id="box2" class="box"></div> 
  <script type="text/javascript" src="move1.js"></script> 
</body> 
</html>

css部分:

*{ 
  margin: 0px; 
  padding: 0px; 
} 
.box{ 
  width: 100px; 
  height: 100px; 
  background-color: green; 
  position: relative; 
  margin-top: 10px; 
}

js部分:

/** 
 * Created by siri on 2016/9/10. 
 */ 
window.onload=function () { 
  var btn1 = document.getElementById('move1'); 
  var btn2 = document.getElementById('move2'); 
  var box1 = document.getElementById('box1'); 
  var box2 = document.getElementById('box2'); 
  btn1.onclick = function () { 
    animate1(box1,500); 
  } 
  btn2.onclick = function () { 
    animate2(box2,500); 
  } 
  //匀速动画 
  function animate1(ele,target){ 
    //要用定时器,先清除定时器 
    //一个盒子只能有一个定时器,这样儿的话,不会和其他盒子出现定时器冲突 
    //而定时器本身讲成为盒子的一个属性 
    clearInterval(ele.timer); 
    //我们要求盒子既能向前又能向后,那么我们的步长就得有正有负 
    //目标值如果大于当前值取正,目标值如果小于当前值取负 
    var speed = target>ele.offsetLeft?3:-3; 
    ele.timer = setInterval(function () { 
      //在执行之前就获取当前值和目标值之差 
      var val = target - ele.offsetLeft; 
      ele.style.left = ele.offsetLeft + speed + "px"; 
      //目标值和当前值只差如果小于步长,那么就不能再前进了 
      //因为步长有正有负,所有转换成绝对值来比较 
      console.log(val); 
      if(Math.abs(val)<=Math.abs(speed)){ 
        ele.style.left = target + "px"; 
        clearInterval(ele.timer); 
 
      } 
    },30); 
  } 
 
  //缓动动画封装 
  function animate2(ele,target) { 
    clearInterval(ele.timer); //清楚历史定时器 
    ele.timer = setInterval(function () { 
      //获取步长 确定移动方向(正负值) 步长应该是越来越小的,缓动的算法。 
      var step = (target-ele.offsetLeft)/10; 
      //对步长进行二次加工(大于0向上取整,小于0项下取整) 
      step = step>0?Math.ceil(step):Math.floor(step); 
      //动画原理: 目标位置 = 当前位置 + 步长 
      console.log(step); 
      ele.style.left = ele.offsetLeft + step + "px"; 
      //检测缓动动画有没有停止 
      if(Math.abs(target-ele.offsetLeft)<=Math.abs(step)){ 
        ele.style.left = target + "px"; //直接移动指定位置 
        clearInterval(ele.timer); 
      } 
    },30); 
  } 
 
 
}

html和css基本就是为了我们的js部分搭框架,不讲太多,要注意的是,一定要对全局的margin和padding清零,否则的话他在计算的时候初始的margin和padding会影响计算,从而导致有时候运动不停止的情况。

javascript部分代码的解析在源码中已经很详细了,下面主要讲解原理。

匀速运动:

通过setInterval函数我们控制每多少毫秒运动的距离,然后在快要到达指定位置的时候,判断步长(每多少毫秒运动的距离)和此时和目标位置的距离,如果步长大于此时和目标位置的距离,则直接定位到目标位置,这样做是为了避免步长和总距离不是整数倍关系而产生最后到达位置和目标位置有差值的错误。

缓冲运动:

缓冲运动的基本函数是和匀速运动一样的,只是缓冲运动的步长我们是通过和目标位置的距离来确定的,这样我们的步长是不断变小的,从而实现缓冲运动的效果。在确定步长的时候我们使用Math.ceil和Math.floor对步长值进行取整是为了避免出现小数,因为如果出现小数后面最后到达的位置肯定是和目标位置有误差的。

注意事项:在每次移动开始前一定要使用clearInterval清除定时器。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
Jul 31 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
Sep 22 Javascript
Array栈方法和队列方法的特点说明
Jan 24 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
Sep 02 Javascript
JS中的Replace方法使用经验分享
May 20 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
Jun 17 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
Oct 19 Javascript
Vue.js 中 axios 跨域访问错误问题及解决方法
Nov 21 Javascript
JS+php后台实现文件上传功能详解
Mar 02 Javascript
关于Vue中$refs的探索浅析
Nov 05 Javascript
vue切换菜单取消未完成接口请求的案例
Nov 13 Javascript
原生js实现表格循环滚动
Nov 24 Javascript
js设置和获取自定义属性的方法
Oct 20 #Javascript
js阻止冒泡和默认事件(默认行为)详解
Oct 20 #Javascript
浅谈JS中String()与 .toString()的区别
Oct 20 #Javascript
详解javascript事件绑定使用方法
Oct 20 #Javascript
angular源码学习第一篇 setupModuleLoader方法
Oct 20 #Javascript
jQuery动态创建元素以及追加节点的实现方法
Oct 20 #Javascript
JS中动态创建元素的三种方法总结(推荐)
Oct 20 #Javascript
You might like
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
2014/06/26 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
基于laravel-admin 后台 列表标签背景的使用方法
2019/10/03 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
使用OpCode绕过Python沙箱的方法详解
2019/09/03 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
django orm模块中的 is_delete用法
2020/05/20 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
机电专业大学生职业规划书范文
2014/02/25 职场文书
销售人员职业生涯规划范文
2014/03/01 职场文书
房产公证书范本
2014/04/10 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
2015年中个人总结范文
2015/03/10 职场文书
旅游项目合作意向书
2015/05/08 职场文书
2015年酒店服务员工作总结
2015/05/18 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书