屏幕刷新频率:
屏幕刷新频率即图像在屏幕上更新的速度,即每秒图像更新的次数,它的单位是赫兹(Hz)。一般笔记本的值是60Hz。这个值受屏幕分辨率、屏幕尺寸、显卡影响。
市面上常见的显示屏有两种:XRT(传统显示屏)和LCD(液晶显示屏)。
CTR是一种使用电子阴极管的显示器,屏幕上的图像是由一个个因电子束击打而发光的荧光点组成,由于显像管内荧光粉受到电子束击打后发光时间很短,所以电子束必须不断击打荧光粉使其不断发光。电子束每秒击打荧光粉的次数就是屏幕更新频率。
LCD即液晶显示器,就不需要更新。因为LCD中每个像素都在持续不断的发光,所以LCD不会有电子束击打荧光粉而引起的闪烁现象。
so,即使你对着显示器什么都不做,显示器也会以每秒60次的频率正在不断的更新屏幕上的图像。
动画原理
动画的本质是让人眼看到图像被刷新而引起变化的视觉效果是以连贯的、平滑的方式进行过渡的。
前面我们已经知道显示器一直在刷新图像,但是我们并没有感觉变化,是因为刷新频率很高,我们感觉不到而已。
举个例子:刷新频率为60Hz的屏幕每16.7ms刷新一次,在屏幕刷新前将图像的位置向左移动1px,这样的话,每次屏幕刷新之后的位置都和原来差1px,因此我们就看到图像在动了。由于人眼的视觉停留效应,当前位置的图像停留在大脑中的印象还没有消失,紧接着图像又移动到下一个位置,因此看到图像是在流畅的移动,这就形成了视觉上的动画。
setTimeout
setTimeout是设置一个时间间隔来不断的改变图像的位置,而达到动画效果。但是setTimeout在某低端机上会出现卡顿、抖动的现象。原因如下:
setTimeout的执行只是在内存中对图像属性进行改变,这个变化必须等到屏幕下次刷新时才会更新到屏幕上。如果两者步调不一致,就出现丢帧了。假设屏幕每个16.7ms更新一次,而setTimeout每10ms设置图像向左移动1px,绘制过程如下:
上面这种情况,屏幕没有更新left = 2px的那一帧图像。图像直接从1px的位置跳到3px的位置,这就是丢帧现象,这种想象就会引起动画的卡顿。
requestAnimationFrame
与setTimeout相比,requestAnimationFrame最大的优势就是由系统决定回调函数的执行时间。requestAnimationFrame的步伐跟着系统的刷新步伐,它能保证回调函数在屏幕每次的刷新间隔中只被执行一次,这样就不会丢帧,也不会导致动画卡顿。
除此之外还有两大优势:
requestAnimationFrame定义:
window.requestAnimationFrame():告诉浏览器,你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传一个回调函数作为参数,该回调函数在浏览器下一次重绘之前执行。
注意:若你想在浏览器下次重绘之前继续更新下一帧动画,那么回调函数自身必须再次调用window.requestAnimationFrame();
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Page Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type="text/css">
#box{
margin: 0 auto;
width: 50px;
height: 50px;
background: green;
margin-top: 100px;
}
</style>
</head>
<body>
<div id="box"></div>
<script>
function animationWidth() {
var div = document.getElementById('box');
div.style.width = parseInt(div.offsetWidth) + 1 + 'px';
if(parseInt(div.style.width) < 200) {
requestAnimationFrame(animationWidth)
}
}
requestAnimationFrame(animationWidth);
</script>
</body>
</html>
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有