javascript - 从左到右然后从右到左动画 div
问题描述
我正在看这个演讲: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?
解决方案
视频中有错误。
这是正确的一段代码:
box.addEventListener("click", () => {
box.style.transform = "translateX(500px)";
requestAnimationFrame(() => {
requestAnimationFrame(() => {
box.style.transition = "transform 1s ease-in-out";
box.style.transform = "translateX(250px)";
});
});
});
推荐阅读
- linux - 执行 yum 命令时终端挂起
- javascript - 使用 Parse.Query 获取作者用户 ID,而不是当前用户
- c# - 如何使用 Excel.Interop 将列表中的值填充到 Excel 中的一系列单元格?
- azure-devops - 如何使用 Azure devops Rest Api 获取最新标签?
- powershell - 尝试为 get-aduser 输入特定用户列表
- reactjs - 如何使 Material-UI CardActions 始终粘在父级的底部
- shell - 如何将 JSON 中的值传递给 Docker 的 shell 脚本中的命令?
- swift - SwiftUI beta 7:添加项目时触发“列表”滚动?
- arcgis-js-api - 我写了这段代码来用javascript在我的Esri的Arcgis地图上显示标记,但这不起作用,请在我的代码中描述问题吗?
- nlp - 多词序列标注