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 相关文章推荐
jquery实现非叠加式的搜索框提示效果
Jan 07 Javascript
网页广告中JS代码的信息监听示例
Apr 02 Javascript
js添加select下默认的option的value和text的方法
Oct 19 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
Aug 27 Javascript
Javascript之面向对象--接口
Dec 02 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
Jul 05 Javascript
利用Vue实现移动端图片轮播组件的方法实例
Aug 23 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
Jan 20 Javascript
JavaScript异步加载问题总结
Feb 17 Javascript
解决Layui 表单提交数据为空的问题
Aug 15 Javascript
layDate插件设置开始和结束时间
Nov 15 Javascript
JS严格模式原理与用法实例分析
Apr 27 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
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
PHP APC缓存配置、使用详解
2014/03/06 PHP
用jQuery简化JavaScript开发分析
2009/02/19 Javascript
JQuery入门—编写一个简单的JQuery应用案例
2013/01/03 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
JavaScript学习笔记之定时器
2015/01/22 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
使用grappelli为django admin后台添加模板
2014/11/18 Python
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
对Python中的@classmethod用法详解
2018/04/21 Python
Python提取频域特征知识点浅析
2019/03/04 Python
Python类的动态绑定实现原理
2020/03/21 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
台湾深度自由行旅游平台:Tripbaa趣吧
2017/10/10 全球购物
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
药品业务员岗位职责
2014/04/17 职场文书
学习方法演讲稿
2014/05/10 职场文书
试用期员工工作自我评价
2014/09/10 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
颐和园导游词400字
2015/01/30 职场文书
大学生党员自我评价
2015/03/04 职场文书
2015年库房管理工作总结
2015/10/14 职场文书
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python
Python软件包安装的三种常见方法
2022/07/07 Python