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 实现 秒杀,团购 倒计时展示的记录 分享
Jul 12 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
Oct 15 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
Oct 17 Javascript
JavaScript面向对象的实现方法小结
Apr 14 Javascript
JS实现队列与堆栈的方法
Apr 21 Javascript
javascript 开发之网页兼容各种浏览器
Sep 28 Javascript
JS去掉字符串中所有的逗号
Oct 18 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
Dec 06 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
Jul 12 Javascript
vue 组件简介
Jul 31 Javascript
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 Vue.js
JavaScript实现复选框全选功能
Apr 11 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字符串 ==比较运算符的副作用
2009/10/21 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
javascript模拟的Ping效果代码 (Web Ping)
2011/03/13 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
微信小程序侧边栏滑动特效(左右滑动)
2017/01/23 Javascript
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
[01:07:53]RNG vs VG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
Python Pillow Image Invert
2019/01/22 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
Django工程的分层结构详解
2019/07/18 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
Python实现爬取并分析电商评论
2020/06/19 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
销售类个人求职信范文
2013/09/25 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
《花钟》教学反思
2016/02/17 职场文书
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server
Python自动化爬取天眼查数据的实现
2021/06/15 Python