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 相关文章推荐
浅析jQuery的链式调用之each函数
Dec 03 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
Jan 15 Javascript
event.currentTarget与event.target的区别介绍
Dec 31 Javascript
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
JSONP原理及简单实现
Jun 08 Javascript
第一次接触神奇的Bootstrap导航条
Aug 09 Javascript
JQuery异步提交表单与文件上传功能示例
Jan 12 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
Feb 22 Javascript
AngularJS constant和value区别详解
Feb 28 Javascript
js实现二级导航功能
Mar 03 Javascript
微信小程序停止其他视频播放当前视频的实例代码
Dec 25 Javascript
vscode中Vue别名路径提示的实现
Jul 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
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
JS的函数调用栈stack size的计算方法
2018/06/24 Javascript
微信小程序获取用户信息并保存登录状态详解
2019/05/10 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
Python开发编码规范
2006/09/08 Python
python网络编程示例(客户端与服务端)
2014/04/24 Python
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
前端实现打印图像功能
2019/08/27 HTML / CSS
联想美国官方商城:Lenovo美国
2017/06/19 全球购物
C#面试常见问题
2013/02/25 面试题
财务工作个人求职的自我评价
2013/12/19 职场文书
外贸英语专业求职信范文
2013/12/25 职场文书
国家励志奖学金获奖感言
2014/01/09 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
优秀教师单行材料
2014/12/16 职场文书
人事专员岗位职责
2015/02/03 职场文书
SQL中的三种去重方法小结
2021/11/01 SQL Server