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中数组的sort()方法的使用介绍
Dec 18 Javascript
取消选中单选框radio的三种方式示例介绍
Dec 23 Javascript
JavaScript中window.open用法实例详解
Apr 15 Javascript
使用RequireJS优化JavaScript引用代码的方法
Jul 01 Javascript
使用CamanJS在Web页面上处理图像的技巧
Aug 18 Javascript
javascript实现方法调用与方法触发小结
Mar 26 Javascript
JavaScript简单实现弹出拖拽窗口(一)
Jun 17 Javascript
Bootstrap输入框组件简单实现代码
Mar 06 Javascript
tangram.js库实现js类的方式实例分析
Jan 06 Javascript
微信小程序实现日历效果
Dec 28 Javascript
优化Vue中date format的性能详解
Jan 13 Javascript
vue实现树状表格效果
Dec 29 Vue.js
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
什么是调频(FM)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
php无序树实现方法
2015/07/28 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
php微信开发自定义菜单
2016/08/27 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
tagName的使用,留一笔
2006/06/26 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
jquery css 设置table的奇偶行背景色示例
2014/06/03 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
微信小程序 wx.uploadFile无法上传解决办法
2016/12/14 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
Python基于twisted实现简单的web服务器
2014/09/29 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
PyQt5实现五子棋游戏(人机对弈)
2020/03/24 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
Python如何telnet到网络设备
2021/02/18 Python
绘画设计学生的个人自我评价
2013/09/20 职场文书
工程造价与管理专业应届生求职信
2013/11/23 职场文书
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
学生打架检讨书1000字
2014/01/16 职场文书
建筑工地标语
2014/06/18 职场文书
学习礼仪心得体会
2014/09/01 职场文书
小学教师自我剖析材料
2014/09/29 职场文书
社保转移委托书范本
2014/10/08 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
销区经理年终述职报告模板
2019/11/28 职场文书
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
Python中的pprint模块
2021/11/27 Python