我正在看这个谈话:https://www.youtube.com/watch?v=cCOL7MC4Pl0
演讲者讨论了JS任务和DOM渲染。他给出了以下示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Task</title>
<style>
* {
box-sizing: border-box;
}
.box {
width: 50px;
height: 50px;
background-color: pink;
}
</style>
</head>
<body>
<div class="box"></div>
<script>
var box = document.querySelector(".box");
box.addEventListener("click", () => {
box.style.transform = "translateX(500px)";
box.style.transition = "transform 1s ease-in-out";
box.style.transform = "translateX(250px)";
});
</script>
</body>
</html>
并尝试对对象进行动画(单击事件),从位置0到位置500px,然后从500px到250px。换句话说,从左到右,从右到中间。
他使用以下代码:
var box = document.querySelector(".box");
box.addEventListener("click", () => {
box.style.transform = "translateX(500px)";
box.style.transition = "transform 1s ease-in-out";
box.style.transform = "translateX(250px)";
});
然后,他解释了为什么它无法按预期方式工作-因为浏览器会在渲染/执行动画之前进行所有计算。一切都很好。
但是,他说他通过将最后一个box.style.transform = "translateX(250px)";
包装到双重(嵌套)requestAnimationFrame()
调用中来解决了这个问题。当我尝试这样做时,它确实做到了与以前完全相同的事情。没用这是代码:
box.style.transform = "translateX(500px)";
box.style.transition = "transform 1s ease-in-out";
requestAnimationFrame(() => {
requestAnimationFrame(() => {
box.style.transform = "translateX(250px)";
});
});
我在这里想念什么?如何使浏览器首先执行到500px的转换操作,然后再转换回250px?
答案 0 :(得分:1)
视频中有一个错误。
这是正确的代码:
box.addEventListener("click", () => {
box.style.transform = "translateX(500px)";
requestAnimationFrame(() => {
requestAnimationFrame(() => {
box.style.transition = "transform 1s ease-in-out";
box.style.transform = "translateX(250px)";
});
});
});
答案 1 :(得分:0)
在第二个语句中使用此setTimeout,否则两个语句都非常快速地一个一个地执行,因此没有得到您想要的实际值。
String DESKTOP_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36";
webView.getSettings().setUserAgentString(DESKTOP_USER_AGENT);
最后声明,