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 相关文章推荐
TopList标签和JavaScript结合两例
Aug 12 Javascript
网页中CDATA标记的说明
Sep 12 Javascript
利用JS实现浏览器的title闪烁
Jul 08 Javascript
用Javascript获取页面元素的具体位置
Dec 09 Javascript
jquery弹出层类代码分享
Dec 27 Javascript
js获得网页背景色和字体色的方法
Mar 21 Javascript
jquery使用hide方法隐藏指定id的元素
Mar 30 Javascript
javascript实现省市区三级联动下拉框菜单
Nov 17 Javascript
微信小程序开发入门基础教程
Apr 19 Javascript
深入理解JavaScript和TypeScript中的class
Apr 22 Javascript
Node.JS获取GET,POST数据之queryString模块使用方法详解
Feb 06 Javascript
在vue中给后台接口传的值为数组的格式代码
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
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
PHP也能干大事 随机函数
2015/04/14 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
浅谈vue路径优化之resolve
2017/10/13 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
python自动格式化json文件的方法
2015/03/11 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
python实现俄罗斯方块游戏
2020/03/25 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
Python通过socketserver处理多个链接
2020/03/18 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
如何在.net Winform里面显示PDF文档
2012/09/11 面试题
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
大学毕业感言200字
2014/03/09 职场文书
继承权公证书
2014/04/09 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书
nginx 配置指令之location使用详解
2022/05/25 Servers