JS动画定时器知识总结


Posted in Javascript onMarch 23, 2018

广义说:一切通过js改变的视觉呈现都叫动画;例如,按钮,链接等元素交互反馈。

狭义说:通过定时器连续调用js函数进行元素属性改变产生的视觉动画效果。

定时器

定时器是JavaScript动画的核心技术;

setTimeout(),setInterval()是大家熟知的,以前经常使用的;

一般都是做些辅助性,锦上添花的事;

细心的人可能会发现一个现象,从其他标签页切换到有循环动画页面会有卡顿和急速帧切换现象;

问题就在于他们的内在运行机制;

认识setTimeout

第一个参数推荐用函数形式,字符串形式会两次解析,还有eval一样的问题;

不止两个参数,可以更多,见示例1;

this指向问题,见示例2;

返回值是个整数;

clearTimeout(timer)取消定时器;

setInterval,clearInterval同上;

示例1:

setTimeout(function(a,b){ 
 console.log(a+b); 
},1000,1,1);

示例2:

var a = 0;
function foo(){
 console.log(this.a);
};
var obj = {
 a : 2,
 foo:foo
}
setTimeout(obj.foo,100);

运行机制

示例:

setTimeout(function(){ 
 console.log(1); 
}); 
console.log(0);

原因:加入队列,阻塞执行。

setTimeout图例:

JS动画定时器知识总结

setInterval图例:

JS动画定时器知识总结

存在即合理

父子元素事件冒泡,需要先执行父元素,见示例3;

用户自定义的回调函数,通常在浏览器的默认动作之前触发,见示例4;

示例3:

<div id="myDiv" style="height: 100px;width: 100px;background-color: pink;"></div>
<script>
myDiv.onclick = function(){
 setTimeout(function(){
  alert(0);
 })
}
document.onclick = function(){
 alert(1);
}
</script>

示例4:

<input type="text" id="myInput">
<script>
myInput.onkeypress = function(event) {
 setTimeout(function(){
  myInput.value = myInput.value.toUpperCase();
 });
}
</script>

认识requestAnimationFrame

用法与setTimeout类似,只是不需要时间参数;

机制完全不同:

1,setTimeout是异步操作,加入任务队列( event loop ),当js引擎线程中同步代码执行完才会从任务队列中取出执行;

2,raf是用户代理(浏览器)专门针对动画开发的接口,用户代理会以合适的频率进行动画帧更新(一般同显示器刷新频率,1000/60ms),在隐藏或者非活动页面会停止帧更新,节省CPU资源;

3,raf示例

JS动画定时器知识总结

raf简单兼容

window.requestAnimFrame = (function(){ 
 return window.requestAnimationFrame || 
   window.webkitRequestAnimationFrame ||   
   window.mozRequestAnimationFrame || 
   function( callback ){  
    window.setTimeout(callback, 1000 / 60);
    };
  })();
Javascript 相关文章推荐
参考:关于Javascript中实现暂停的几篇文章
Mar 04 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
Aug 09 Javascript
使用POST方式弹出窗口的两种方法示例介绍
Jan 29 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
Apr 17 Javascript
node.js下when.js 的异步编程实践
Dec 03 Javascript
JavaScript设计模式经典之命令模式
Feb 24 Javascript
jQuery的ajax和遍历数组json实例代码
Aug 01 Javascript
Javascript 实现简单计算器实例代码
Oct 23 Javascript
实例详解BootStrap的动态模态框及静态模态框
Aug 13 Javascript
node express使用HTML模板的方法示例
Aug 22 Javascript
在Vue中使用antv的示例代码
Jun 29 Javascript
JavaScript array常用方法代码实例详解
Sep 02 Javascript
p5.js 毕达哥拉斯树的实现代码
Mar 23 #Javascript
轻量级JS Cookie插件js-cookie的使用方法
Mar 22 #Javascript
浅谈Webpack 持久化缓存实践
Mar 22 #Javascript
深入浅析Vue.js中 computed和methods不同机制
Mar 22 #Javascript
Java设计中的Builder模式的介绍
Mar 22 #Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
Mar 22 #Javascript
收集前端面试题之url、href、src
Mar 22 #Javascript
You might like
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
PHP jQuery表单,带验证具体实现方法
2014/02/15 PHP
浅谈COOKIE和SESSION区别
2015/07/19 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
js 字符串转化成数字的代码
2011/06/29 Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
2012/01/15 Javascript
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
js实现漂亮的星空背景
2019/11/01 Javascript
vue+iview实现分页及查询功能
2020/11/17 Vue.js
跟老齐学Python之list和str比较
2014/09/20 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
python数据结构之链表的实例讲解
2017/07/25 Python
python 读取文件并替换字段的实例
2018/07/12 Python
virtualenv 指定 python 解释器的版本方法
2018/10/25 Python
python实现名片管理器的示例代码
2019/12/17 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
2020/11/19 Python
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
美国探亲签证邀请信
2014/02/05 职场文书
C++程序员求职信范文
2014/04/14 职场文书
爱我中华教学反思
2014/04/28 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
介绍一下28个JS常用数组方法
2022/05/06 Javascript