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 相关文章推荐
Javascript实现的鼠标经过时播放声音
May 18 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
Dec 28 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
Apr 30 Javascript
JQuery中层次选择器用法实例详解
May 18 Javascript
jquery转盘抽奖功能实现
Nov 13 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
Aug 24 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
Feb 23 Javascript
Google 爬虫如何抓取 JavaScript 的内容
Apr 07 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
May 07 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
Jun 12 Javascript
详解JSONObject和JSONArray区别及基本用法
Oct 25 Javascript
解决vue-cli 打包后自定义动画未执行的问题
Nov 12 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
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
php实现监听事件
2013/11/06 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
js资料toString 方法
2007/03/13 Javascript
基于JQuery框架的AJAX实例代码
2009/11/03 Javascript
javascript delete 使用示例代码
2010/03/29 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
详解ES6中的三种异步解决方案
2018/06/28 Javascript
关于vue状态过渡transition不起作用的原因解决
2019/04/09 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
函授药学自我鉴定
2014/02/07 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
罚站检讨书
2015/01/29 职场文书
邀请书格式范文
2015/02/02 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
大学毕业典礼致辞
2015/07/29 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
你真的了解PHP中的引用符号(&)吗
2021/05/12 PHP
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python