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 相关文章推荐
iis6+javascript Add an Extension File
Jun 13 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
Apr 23 Javascript
jquery ajax请求实例深入解析
Nov 26 Javascript
jquery实现树形二级菜单实例代码
Nov 20 Javascript
初识Node.js
Sep 03 Javascript
Javascript的表单验证长度
Mar 16 Javascript
原生JS和jQuery操作DOM对比总结
Jan 19 Javascript
jQuery实现获取隐藏div高度的方法示例
Feb 09 Javascript
JavaScript拖动层Div代码
Mar 01 Javascript
JavaScript高级函数应用之分时函数实例分析
Aug 03 Javascript
详解Vscode中使用Eslint终极配置大全
Nov 08 Javascript
vue设置默认首页的操作
Aug 12 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
PHP insert语法详解
2008/06/07 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
javascript 面向对象思想 附源码
2009/07/07 Javascript
jquery 延迟执行实例介绍
2013/08/20 Javascript
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
JQuery中$.ajax()方法参数详解及应用
2013/12/12 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
2017/02/17 Javascript
JS验证字符串功能
2017/02/22 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
JavaScript实现短信倒计时60s
2017/10/09 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
2019/09/27 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
Python类的继承用法示例
2019/01/31 Python
Python之时间和日期使用小结
2019/02/14 Python
使用python的pexpect模块,实现远程免密登录的示例
2019/02/14 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
python3字符串输出常见面试题总结
2020/12/01 Python
购买英国原创艺术:Art Gallery
2018/08/25 全球购物
便利店的创业计划书
2014/01/15 职场文书
教育局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
工作态度检讨书范文
2015/05/06 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python