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 相关文章推荐
可以支持多中格式的JS键盘
May 02 Javascript
运用jquery实现table单双行不同显示并能单行选中
Jul 25 Javascript
jQuery插件pagination实现分页特效
Apr 12 Javascript
jquery模拟alert的弹窗插件
Jul 31 Javascript
JavaScript中的this关键字使用详解
Aug 14 Javascript
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
Javascript 正则表达式校验数字的简单实例
Nov 02 Javascript
React中使用UMEditor的方法示例
Dec 27 Javascript
vue实现登录拦截
Jun 29 Javascript
jQuery中event.target和this的区别详解
Aug 13 jQuery
vue实现简单计算商品价格
Sep 14 Javascript
react ant Design手动设置表单的值操作
Oct 31 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
PHP4实际应用经验篇(1)
2006/10/09 PHP
用PHP控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
php mongodb操作类 带几个简单的例子
2016/08/25 PHP
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
JavaScript调用客户端的可执行文件(示例代码)
2013/11/28 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
JS实现多物体运动的方法详解
2018/01/23 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
JavaScript实现串行请求的示例代码
2020/09/14 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
Python SQLite3数据库操作类分享
2014/06/10 Python
Python中声明只包含一个元素的元组数据方法
2014/08/25 Python
基于Django模板中的数字自增(详解)
2017/09/05 Python
使用python模拟命令行终端的示例
2019/08/13 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
詹天佑教学反思
2014/04/30 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
2014年教学工作总结
2014/11/13 职场文书
小数乘法教学反思
2016/02/22 职场文书
小学科学课教学反思
2016/02/23 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
Python利用zhdate模块实现农历日期处理
2022/03/31 Python