没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
前言 计时器一直是javascript动画的核心技术。而编写动画循环的关键是要知道延迟时间多长合适。一方面,循环间隔必须足够短,这样才能让不同的动画效果显得平滑流畅;另一方面,循环间隔还要足够长,这样才能确保浏览器有能力渲染产生的变化。 大多数电脑显示器的刷新频率是60Hz,大概相当于每秒钟重绘60次。大多数浏览器都会对重绘操作加以限制,不超过显示器的重绘频率,因为即使超过那个频率用户体验也不会有提升。因此,最平滑动画的最佳循环间隔是1000ms/60,约等于16.6ms。 而setTimeout和setInterval的问题是,它们都不精确。它们的内在运行机制决定了时间间隔参数实际上只是指定
资源详情
资源评论
资源推荐
深入理解深入理解HTML5定时器定时器requestAnimationFrame的使用的使用
前言前言
计时器一直是javascript动画的核心技术。而编写动画循环的关键是要知道延迟时间多长合适。一方面,循环间隔必须足够
短,这样才能让不同的动画效果显得平滑流畅;另一方面,循环间隔还要足够长,这样才能确保浏览器有能力渲染产生的变
化。
大多数电脑显示器的刷新频率是60Hz,大概相当于每秒钟重绘60次。大多数浏览器都会对重绘操作加以限制,不超过显示器
的重绘频率,因为即使超过那个频率用户体验也不会有提升。因此,最平滑动画的最佳循环间隔是1000ms/60,约等于
16.6ms。
而setTimeout和setInterval的问题是,它们都不精确。它们的内在运行机制决定了时间间隔参数实际上只是指定了把动画代码
添加到浏览器UI线程队列中以等待执行的时间。如果队列前面已经加入了其他任务,那动画代码就要等前面的任务完成后再执
行。
requestAnimationFrame采用系统时间间隔,保持最佳绘制效率,不会因为间隔时间过短,造成过度绘制,增加开销;也不会
因为间隔时间太长,使用动画卡顿不流畅,让各种网页动画效果能够有一个统一的刷新机制,从而节省系统资源,提高系统性
能,改善视觉效果。
特点特点
requestAnimationFrame会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧
紧跟随浏览器的刷新频率。
在隐藏或不可见的元素中,requestAnimationFrame将不会进行重绘或回流,这当然就意味着更少的CPU、GPU和内存使用
量。
requestAnimationFrame是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活
状态下的话,动画会自动暂停,有效节省了CPU开销。
用法用法
requestAnimationFrame方法将一个callback作为参数,回调函数会被传入一个参数,DOMHighResTimeStamp,指示当前被
requestAnimationFrame() 排序的回调函数被触发的时间。返回值是一个请求 ID,表示回调列表中唯一的标识。可以传这个值
给 window.cancelAnimationFrame() 以取消回调函数。
requestID = window.requestAnimationFrame(callback);
利用这个api,可以将某些代码放到下一次重新渲染时执行,避免短时间内触发大量reflow。
例如页面滚动事件(scroll)的回调函数就很适合使用这个api, 将回调操作推迟到下一次重新渲染。但需要注意的是
requestAnimationFrame 不管理回调函数,即在回调被执行前,多次调用带有同一回调函数的 requestAnimationFrame,会导
致回调在同一帧中执行多次。最简单的,可以用节流函数来解决这个问题,也可以想办法让requestAnimationFrame的队列里
同样的回调函数只有一个:
let scheduledAnimationFrame = false;
document.body.onscroll = () => {
if (scheduledAnimationFrame) return;
scheduledAnimationFrame = true;
window.requestAnimationFrame(() => {
scheduledAnimationFrame = false;
// do something
});
};
当然,最佳的应用场景还是在帧动画里,可以大幅优化性能。
面试题面试题
如何渲染几万条数据并不卡住界面如何渲染几万条数据并不卡住界面
这道题考察了如何在不卡住页面的情况下渲染数据,也就是说不能一次性将几万条都渲染出来,而应该一次渲染部分 DOM,
那么就可以通过 requestAnimationFrame 来每 16 ms 刷新一次。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
weixin_38569219
- 粉丝: 4
- 资源: 984
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0