使用requestAnimationFrame做动画效果一

最近学习了requestAnimationFrame,看了张鑫旭直白易懂,但是某些地方语言过于裸露的文章http://www.zhangxinxu.com/wordpress/2013/09/css3-animation-requestanimationframe-tween-%E5%8A%A8%E7%94%BB%E7%AE%97%E6%B3%95/,文章里的例子:http://www.zhangxinxu.com/study/201309/requestanimationframe-tween-easeoutbounce.html让我觉得这个requestAnimationFrame很厉害,虽然我对动画的接触还不多,但是我会努力的。

requestAnimationFrame是什么么?

requestAnimationFrame 是专门为实现高性能的帧动画而设计的一个API:

说简单点

    • setInterval、setTimeout是开发者主动要求浏览器去绘制,但是由于种种问题,浏览器可能会漏掉部分命令
    • requestAnimationFrame 就是浏览器什么要开始绘制了浏览器自己知道,通过requestAnimationFrame 告诉开发者,这样就不会出现重复绘制丢失的问题了
    • requestAnimationFrame 会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率,一般来说,这个频率为每秒60帧
    • 隐藏或不可见的元素中,requestAnimationFrame将不会进行重绘或回流,这当然就意味着更少的的cpu,gpu和内存使用量。
    • requestAnimationFrame也会像setTimeout一样有一个返回值ID用于取消,可以把它作为参数传入cancelAnimationFrame函数来取消requestAnimationFrame的回调

下面是一个简单的例子:



<!doctype html><img id="book" style="background:red;opacity:1;position: relative; left: 500px;" width="100" height="123" data-mce-style="background: red; opacity: 1; position: relative; left: 500px;" /><div id="several"><br /></div><script type="text/javascript">

var book = document.getElementById(‘book‘)
var several = document.getElementById(‘several‘);

animate(book, {
left: 50,
duration: 2000
})

function animate(elem, options){
//动画初始值
var start = 500
//动画结束值
var end = options.left
//动画id
var timerId;
var createTime = function(){
return (+new Date)
}
//动画开始时间
var startTime = createTime();
function runCode(cod1) {
var cod = window.document.all(cod1)
var code = cod.value;
var newwin = window.document.open(‘‘, ‘‘, ‘‘);
newwin.opener = null
newwin.document.write(code);
newwin.document.close();
}
var i = 0;

function tick(){
i++;
several.innerHTML = ‘setInterval调用次数:‘ + i;
//每次变化的时间
var remaining = Math.max(0, startTime + options.duration - createTime())
var temp = remaining / options.duration || 0;
var percent = 1 - temp;
var stop = function(){
//停止动画
clearInterval(timerId);
timerId = null;
}
var setStyle = function(value){
elem.style[‘left‘] = value + ‘px‘
}
//移动的距离
var now = (end - start) * percent + start;
if(percent === 1){
setStyle(now)
stop();
}else{
setStyle(now)
}
}

//开始执行动画
var timerId = setInterval(tick, 13);
}
</script>

我做了个练习:

每隔1s长生一个小方块,让其匀速下落,落到底部消失,如果碰到底部中间的方块,小方块消失,分数加1,这个例子还有很多不足的地方,我会继续完善:

 1 <script>
 2             window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
 3             var h=0;               var timer=setInterval(function(){
 4             if(h>40){
 5                 clearInterval(timer);return;
 6             }else{
 7             h+=1;
 8             var isSucceed;
 9             var isOnBelow;
10             var isStillOn;
11             var dotX;
12             var dot=new Dot();
13             dotX=dot.getName();
14             isStillOn=true;
15             animate(dot.dom, {
16                 top: window.innerHeight-dot.dom.offsetHeight,
17                 duration: 3000
18             });
19             function animate(elem, options){
20                 //动画初始值
21                 var start = 0
22                 //动画结束值
23                 var end = options.top
24                 var createTime = function(){
25                     return  (+new Date)
26                 }
27                 //动画开始时间
28                 var startTime = createTime();
29                 var timerId;
30                 //开始动画
31                 var startAnim = function() {
32                     timerId = requestAnimationFrame(tick,15);
33                 }
34                 //停止动画
35                 var stopAnim = function() {
36                     cancelAnimationFrame(timerId)
37                 }
38                 var number=0;
39                 var isRemove=true;
40                 function tick(){
41                     number++;
42                     //每次变化的时间
43                     var remaining = Math.max(0, startTime + options.duration - createTime())
44                     var temp = remaining / options.duration || 0;
45                     var percent = 1 - temp;
46                     var setStyle = function(value){
47                         elem.style[‘top‘] = value + ‘px‘;
48                         var centerW=center.offsetLeft;
49                         var centerH=center.offsetTop;
50                         if(value>=(centerH-42)){
51                             isOnBelow=true;
52                         }else{
53                             isOnBelow=false;
54                         }
55                        if(dotX>=(centerW-50)&&dotX<=(centerW+200)){
56                             isSucceed=true;
57                         }else{
58                             isSucceed=false;
59                         }
60                     }
61                     if(isRemove&&isOnBelow&&isSucceed){
62                         isRemove=false;
63                         stopAnim() ;
64                         document.getElementById("view").removeChild(elem);
65                         isStillOn=false;
66                         count++;
67                         document.getElementById("count").innerHTML="总分为:"+count+"分";
68                     }
69                     //移动的距离
70                     var now = (end - start) * percent + start;
71                     if(percent === 1){
72                         setStyle(now);
73                         if(isStillOn){
74                             document.getElementById("view").removeChild(elem);
75                         }
76                         stopAnim() ;
77                     }else{
78                         setStyle(now);
79                         startAnim(tick);
80                     }
81                 }
82                 //开始执行动画
83                 startAnim(tick);
84             }
85         }},1000)
86         document.getElementById("center").addEventListener("touchmove",function(e){
87                  var touch=e.targetTouches[0].pageX;
88                  // if(touch<0){touch=100;}
89                  // if(touch>(document.body.clientWidth-center.clientWidth)){touch=document.body.clientWidth-center.clientWidth+100}
90                  document.getElementById("center").style.left=touch+"px";
91         });
92
93     </script>
时间: 2024-12-28 14:20:41

使用requestAnimationFrame做动画效果一的相关文章

使用requestAnimationFrame做动画效果二

3月是个好日子,渐渐地开始忙起来了,我做事还是不够细心,加上感冒,没精神,今天差点又出事了,做过的事情还是要检查一遍才行,哎呀. 使用requestAnimationFrame做动画,我做了很久,终于在二月底完工了,中间绕了不少弯路,先把domo放出来: 要实行的功能显而易见,一开始我粗糙地不考虑性能,不使用requestAnimationFrame,已经做出来了,但是觉得不好,于是进行了进一步改进.采用对象的方法,先生成10个粉色的小方块,隐藏起来,然后利用requestAnimationFr

iOS使用代码调整约束做动画效果时出现Unable to simultaneously satisfy constraints.

出现这个问题时, 首先应该仔细看错误, 去除多余的存在冲突的约束, Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect;

transition和animation做动画(css动画二)

前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! translate:平移:是transform的一个属性: transform:变形:是一个静态属性,可以改变元素的形状或位置,做出2d或3d效果: transition:过渡,转变:使css属性值在一段时间内平滑的变化,需要有触发条件(如hover等),是animation的简化版: animation:动画:可以设置多帧效果,然后把它们组合变换,按动画效果展示出来: 1. transition 过渡

用杯赛尔曲线(做动画和绘图)

1. 用被塞尔曲线做动画 效果:位置沿着贝瑟尔曲线位置移动,尺寸由大到小,透明度从完全可见过渡到彻底透明. 至于在DrawRect里面绘制贝塞尔曲线,可以直接百度,没有什么难点的. - (void)clickButton:(id)sender { UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:btn.center]; [path addCurveToPoint:btn.center controlPoint1:

ios 动画效果CATransition笔记

初学ios开发,很多概念还不清楚,所以只有边学边做例子.又怕学了后面忘了前面,因此用自己的博客来纪录自己的学习历程,也是对自己学习不要懈怠做个监督. 刚学ios做动画效果.因为ios封装得很好,实现ios的漂亮动画效果也很简单,却因为我自己的粗心落了一个字母 导致纠结了一天,这个教训必须记住,同时也懂得了调试技能在编程里地位也是非常重要的存在. 实现ios动画有两种方法:一种UIView层面的,一种是使用CATransition. [objc] view plaincopy - (void)vi

原生js动画效果(源码解析)

在做页面中,多数情况下都会遇到页面上做动画效果,之前一直都是用jquery,一直没有试过用原生的js来做,今天正好看到一篇js原生动画的效果,特记录在此, 原文地址:http://www.it165.net/pro/html/201410/23513.html 1.匀速动画效果 说明:匀速动画就是动画的效果从开始到结束每次执行的速度都是一致的 01.<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www

做动画的一大接口 requestAnimationFrame

要实现动画效果,可以有以下几种实现: 1.setInterval setTimeout 2.css3 transition 3.requestAnimationFrame requestAnimationFrame是浏览器自带的api,传入参数为动画效果的执行函数. 因为是浏览器自带的函数,所以执行动画的频率和浏览器显示频率是一致的(目前大部分浏览器显示频率为16.7ms,即1000/60ms),并且在切换到别的tab页之后,也就是页面没被激活时是不执行动画的.和setInterval setT

手把手教你做安豆计算器(八)-动画效果

第9节 动画效果 当用户点击了=以后,为了让结果区域的显示和表达式区域的清空显得很优雅,我们可以为它们添加淡如淡出的效果:让结果区域的文字淡入,让表达式区域的文字淡出. 这种效果可以使用动画实现. 安卓系统的动画可以分成, 逐帧动画:就像电影胶片那样,通过连续放映一张一张差距不大的图片实现动画效果: 属性动画:一点点改变控件的某个属性值,从而产生动画的视觉效果: 渐变动画:产生控件的透明效果 平移效果 缩放效果或者旋转效果: 我们准备加入的文字淡入淡出效果,就是渐变动画的透明效果. 9.1 定义

秀才提笔忘了字:javascript使用requestAnimationFrame实现动画

requestAnimationFrame优于setTimeout/setInterval的地方在于它是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活状态下的话,动画会自动暂停,有效节省了CPU开销,这篇文章给大家详细介绍使用requestAnimationFrame实现js动画:仪表盘效果. 参考链接:http://www.cnblogs.com/libin-1/p/6068340.html 废话不多说,先看看一个效果: 直接上代码: <!DOCTYP