requestAnimation示例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>requestAnimation</title>
		<style type="text/css">
			.container {
				position: relative;
			}

			#percent {
				display: inline-block;
				width: 50px;
			}
		</style>
	</head>
	<body>
		<h1>切到后台或其他浏览器tab,requestAnimation不再执行</h1>
		<button id="requestAnimationFrame1">requestAnimationFrame1</button>
		<button id="cancelAnimationFrame1">cancelAnimationFrame1</button>

		<h1>requestAnimation演示动画</h1>
		<div class="container">
			<progress value=0 id="bar" max="100"></progress>
			<span id="percent">0%</span>

			<button id="requestAnimationFrame2">requestAnimationFrame2</button>
			<button id="cancelAnimationFrame2">cancelAnimationFrame2</button>
		</div>
		<h1>requestAnimationFrame不是宏任务也不是微任务,而是浏览器提供的用于动画的特殊API</h1>
		<p>requestAnimationFrame是浏览器的API,用于指示浏览器在下一次绘图周期时调用指定的函数更新动画。这个调用时机通常是浏览器刷新屏幕前的最后一刻,也就是说,它是同步于显示硬件的刷新频率的</p>
		<p>如果涉及渲染页面, 如回流或重绘:执行顺序是promise-->requestAnimation-->setTimeout</p>
		<p>如果不涉及渲染页面,如部分热更新(概率较小):执行顺序是promise-->setTimeout-->requestAnimation</p>
		<p>requestAnimationFrame执行顺序分两种情况,如果微任务执行完之后页面发生了渲染则会马上执行requestAnimationFrame,否则会在微任务执行完后执行宏任务,再执行requestAnimationFrame</p>
		<p>总结:浏览器的渲染机制决定了requestAnimation的执行顺序</p>		<script type="text/javascript">
			var id1, id2 = 0;
			var raf1 = document.querySelector("#requestAnimationFrame1");
			var caf1 = document.querySelector("#cancelAnimationFrame1");

			var raf2 = document.querySelector("#requestAnimationFrame2");
			var caf2 = document.querySelector("#cancelAnimationFrame2");
			var bar = document.querySelector("#bar");
			var percent = document.querySelector("#percent");

			function changeTitle(timestamp) {
				console.log(id1);
				document.title = id1;
				id1 = requestAnimationFrame(changeTitle);
			}


			document.addEventListener("visibilitychange", () => {
				if (document.hidden) {
					cancelAnimationFrame(id1);
					console.clear();
					id1 = requestAnimationFrame(changeTitle);
				}
			})

			raf1.onclick = function() {
				id1 = requestAnimationFrame(changeTitle);
			}
			caf1.onclick = function() {
				cancelAnimationFrame(id1);
			}



			function animate() {
				if (id2 <= 100) {
					bar.value = id2;
					percent.innerText = id2 + "%";
					id2 = requestAnimationFrame(animate);
				}
			}
			raf2.onclick = animate;
			caf2.onclick = function() {
				cancelAnimationFrame(id2);
			}
			
			
			
			
			setTimeout(function(){
			  console.log("我是宏任务setTimeout", new Date().getTime())
			},5)
			
			requestAnimationFrame(function(){
			  console.log("我是requestAnimationFrame", new Date().getTime());
			})
			
			new Promise(function(resolve){
			  resolve('我是微任务Promise')
			}).then(res=>{
			  console.log(res, new Date().getTime());
			})
		</script>
	</body>
</html>

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值