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 DOM写的类似微博发布的效果
Oct 20 Javascript
JS实现可改变列宽的table实例
Jul 02 Javascript
jQuery实现单击和鼠标感应事件
Feb 01 Javascript
简单分析javascript面向对象与原型
May 21 Javascript
js图片轮播特效代码分享
Sep 07 Javascript
js实现炫酷的左右轮播图
Jan 18 Javascript
jQuery学习之DOM节点的插入方法总结
Jan 22 Javascript
集合Bootstrap自定义confirm提示效果
Sep 19 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
Nov 13 Javascript
在layui框架中select下拉框监听更改事件的例子
Sep 20 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
Oct 21 Javascript
vue 清空input标签 中file的值操作
Jul 21 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 addslashes和mysql_real_escape_string
2010/01/24 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
HTML node相关的一些资料整理
2010/01/01 Javascript
jquery attr方法获取input的checked属性问题
2014/05/26 Javascript
基于JavaScript代码实现pc与手机之间的跳转
2015/12/23 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
简单的js表格操作
2016/09/24 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
原生js实现自定义滚动条
2021/01/20 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
Python格式化日期时间操作示例
2018/06/28 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
python中 * 的用法详解
2019/07/10 Python
python虚拟环境完美部署教程
2019/08/06 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
2020/02/26 Python
css3实现一款模仿iphone样式的注册表单
2013/03/20 HTML / CSS
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
教师节标语大全
2014/10/07 职场文书
2015年全民创业工作总结
2015/07/23 职场文书