咱们常常经过setInterval或setTimeout定时修改DOM、CSS实现动画,浏览器
1.通过浏览器优化,动画更流畅异步
2.窗口没激活时,动画将中止,省计算资源函数
3.更省电,尤为是对移动终端优化
由系统来决定回调函数的执行时机。具体一点讲,若是屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次,若是刷新率是75Hz,那么这个时间间隔就变成了1000/75=13.3ms,换句话说就是,requestAnimationFrame的步伐跟着系统的刷新步伐走。它能保证回调函数在屏幕每一次的刷新间隔中只被执行一次,这样就不会引发丢帧现象,也不会致使动画出现卡顿的问题。动画
.sj{
width:50px;
height:50px;
border:1px solid red;
position:absolute;
left:0
}
<div class="sj" id="sj"></div>
//ele为要移动的盒子,target为目标位置(像素),spd为计数器的频率
var ele = document.getElementById('sj')
function animate(ele,spd){
var start = Date.now(); // remember start time
var timer = setInterval(function() {
var timePassed = Date.now() - start;
var step = Math.ceil(Math.abs(timePassed - 5000)/10)
console.log(step)
if (timePassed >= 5000) {
clearInterval(timer); // finish the animation after 2 seconds
return;
}
ele.style.left = ele.offsetLeft + step + 'px'
}, spd);
}
复制代码
function animate1(ele,target,spd){
var timer = setInterval(function() {
var step = (target-ele.offsetLeft)/10;
//对步长进行二次加工(大于0向上取整,小于0向下取整)
step = step>0?Math.ceil(step):Math.floor(step);
//动画原理: 目标位置 = 当前位置 + 步长
ele.style.left = ele.offsetLeft + step + "px";
//检测缓动动画有没有中止
if(Math.abs(target-ele.offsetLeft)<=Math.abs(step)){
//处理小数赋值
ele.style.left = target + "px";
clearInterval(timer);
}
}, spd);
}
复制代码