其主要思想是通过setIntervalsetTimeout()requestAnimationFrame方法的回调函数来持续调用改变某个元素的CSS样式以达到元素样式变化的效果。

示例

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<style type="text/css">
		#rect {
			width: 200px;
			height: 200px;
			background: #ccc;
		}
	</style>
</head>
<body>
	<div id="rect"></div>
	<script>
		let elem = document.getElementById('rect');
		let left = 0;
		let timer = setInterval(function(){
			if(left<window.innerWidth-200){
				elem.style.marginLeft = left+'px';
				left ++;
			}else {
				clearInterval(timer);
			}
		},16);
	</script>
</body>
</html>

Jquery的animate()方法就是这种方式实现的。

存在的问题

javascript 实现动画通常会导致页面频繁性重排重绘,消耗性能,一般应该在桌面端浏览器。在移动端上使用会有明显的卡顿。

Tip:为什么是16ms

上面例子中,我们设置的setInterval时间间隔是16ms。一般认为人眼能辨识的流畅动画为每秒60帧,这里16ms比(1000ms/60)帧略小一些,但是一般可仍为该动画是流畅的。 在很多移动端动画性能优化时,一般使用16ms来进行节流处理连续触发的浏览器事件。例如对touchmove、scroll事件进行节流等。通过这种方式减少持续事件的触发频率,可以大大提升动画的流畅性。