请求动画帧
曾经面试被问到一个问题,请求10万条数据,如果让页面不卡顿。其实我当时显得就是用定时器,但是发现时间不好把控。然后查了一些资料发现
requestAnimationFrame可以完美解决这个问题。requestAnimationFrame是通过请求动画帧来实现的
屏幕刷新频率
动画原理
1000/60 = 计算机每16.7ms刷新一次。由于人眼的视觉停留,所以看起来是流畅的移动
setTimeout
通过设定间隔时间来不断改变图像位置,达到动画效果。但是容易出现卡顿、抖动的现象;
- settimeout任务被放入异步队列,只有当主线程任务执行完后才会执行队列中的任务,因此实际执行时间总是比设定时间要晚;
- settimeout的固定时间间隔不一定与屏幕刷新时间相同,会引起丢帧。
requestAnimationFrame
优势:由系统决定回调函数的执行时机。60Hz的刷新频率,那么每次刷新的间隔中会执行一次回调函数,不会引起丢帧,不会卡顿
案例requestAnimationFrame
requestAnimationFrame可以完美解决这个问题,而且页面不会发生卡顿。
let num = 0;function raf() {num += 1;let clearInter;if (num < 100) {let span = document.createElement('span')clearInter = window.requestAnimationFrame(() => {document.querySelector('body').appendChild(span).innerHTML = `${num}res - `raf()})console.log('requestAnimationFrame');} else {console.log('gai');cancelAnimationFrame(clearInter)}}window.requestAnimationFrame(raf)
案例setInterval
使用定时器的过程,确实会发生卡顿现象,而且时间不好控制。
let num1 = 0;function Interval() {let clears = setInterval(() => {num1 += 1;let span = document.createElement('span');document.querySelector('body').appendChild(span).innerHTML = `${num1}set -`if (num1 >= 100) {clearInterval(clears)}console.log('setInterval');})}Interval()
