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 更新 JavaScript 数组的 uniq 方法
Jan 23 Javascript
JQuery中each()的使用方法说明
Aug 19 Javascript
javascript实现在指定元素中垂直水平居中
Sep 13 Javascript
jquery获取img的src值的简单实例
May 17 Javascript
JS简单实现仿百度控制台输出信息效果
Sep 04 Javascript
Ionic2开发环境搭建教程
Aug 20 Javascript
实例解析ES6 Proxy使用场景介绍
Jan 08 Javascript
Vue.js图片预览插件使用详解
Aug 27 Javascript
详解JavaScript 的变量
Mar 08 Javascript
node(koa2) web应用模块介绍详解
Mar 29 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
Jul 08 Javascript
Vue单页面应用中实现Markdown渲染
Feb 14 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
深入理解PHP原理之异常机制
2010/08/21 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
详解PHP PDO简单教程
2019/05/28 PHP
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
javascript常用正则表达式汇总
2015/07/31 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
2015/10/08 Javascript
JS+CSS实现大气清新的滑动菜单效果代码
2015/10/22 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
Angular 4环境准备与Angular cli创建项目详解
2017/05/27 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
基于HTML5的齿轮动画特效
2016/02/29 HTML / CSS
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
文体活动实施方案
2014/03/27 职场文书
计算机实训报告总结
2014/11/05 职场文书
春季运动会开幕词
2015/01/28 职场文书
吴仁宝观后感
2015/06/09 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
jquery插件实现代码雨特效
2021/04/24 jQuery