requestAnimationFrame在鼠标点击前无效

用css的transition和requestAnimationFrame实现一个动画,但似乎遇到了一点玄学问题。
先单击空白的地方后,再点击提交才会有动画

刷新页面,不要点击空白地方,直接提交,不会有动画

代码只有40行,求解答!
<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> 
<title>codeRoot's JavaScript</title> 
<script type="text/javascript">
	var pos = 0;
	function disableBeforeClickBlank(){
		var element   = document.createElement("div");
		pos+=100;
		document.querySelector(".my").appendChild(element);
		// var element = document.getElementById("my");
		element.setAttribute("class", "tile");
		element.setAttribute("style", "left:0px");
		element.textContent = 'text';
		window.requestAnimationFrame(function () {
		  element.setAttribute("style", `left:${pos}px`);
		});
	}
</script>

<style type="text/css">
.tile {
	position: absolute;
	left: 0px;
	background: #eee4da;
	text-align: center;
	font-weight: bold;
	font-size: 55px;
	transition: 1000ms ease-in-out;
</style>
</head>
<body>
	<input type="submit" onclick="disableBeforeClickBlank()">
	<div class="my"></div>
</body>
</html>


#前端##笔试题目#
全部评论
的确是个很奇怪的问题, 但是我感觉楼主若换一种写法就能避免这种问题 1. 首先 RAF 的每一次调用都应该是更新一帧动画, 注意是一帧, 而不是像楼主一样用一次 RAF 来执行一个长达1s的动画. 浏览器在页面焦点发生切换时是可能对动画的帧进行优化的. 实际上, 这种调用方法也并不能发挥 RAF 的优势(即页面没有focus时动画暂停) 2. CSS3的transition 和 RAF 都是实现动画的两种方式, 最好单独用, 混在一起用的话是可能出现类似的问题. 3. 对于楼主的这种情况, 直接把 window.requestAnimationFrame 换成最原始的 setTimeout(xxx, 0) 就能解决问题.
1 回复 分享
发布于 2020-06-07 15:23
确实奇怪,m
点赞 回复 分享
发布于 2020-06-07 12:32

相关推荐

不愿透露姓名的神秘牛友
今天 10:39
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务