javascript - 为什么 document.getElementById().style.transform="translateX()" 的“转换”只会翻译一次?
问题描述
我正在制作一个新的在线游戏。当我单击一个按钮时,我希望红色方块在 X 轴上平移 50 像素。这是HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>cake (singleplayer 2d adventure game)</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<script>
function moveright() {
document.getElementById("master-cube").style.transform = "translateX(50px)";
}
</script>
<div id="master-cube"></div><img src="arrows/rightarrow.png" alt=h"Right Arrow" height="60vh" width="60vw" onclick="moveright()" class="arrowcontrols">
<img src="arrows/middlejumpsquare.png" alt="Jump Square" height="60vh" width="60vw" onclick="movejump()" class="arrowcontrols">
<img src="arrows/leftarrow.png" alt="Left Arrow" height="60vh" width="60vw" onclick="moveright()" class="arrowcontrols">
</body>
</html>
我知道图像不会加载。如果向下滚动,您会找到一个 Repl.it。
这是CSS:
html {margin: none;}
body {margin: none; width: 100vw; height: 100vh;}
.arrowcontrols {float: right; margin-right: 5px; margin-top: 90%; margin-bottom: 10%;}
#master-cube {background-color: #FF0000; height: 40px; width: 40px;}
如果你想看 Repl.it,这里是它的链接: https ://repl.it/@ritzcrackerz201/cake
解决方案
那是因为你的元素transform: translateX(50px)
一旦你设置了它。它总是在那里,并且再次将其设置为相同的东西不会做任何事情。
您必须将其设置为其他内容,例如:
let displacement = 50;
function moveright() {
document.getElementById("master-cube").style.transform = `translateX(${displacement}px)`;
displacement += 50;
}
html {
margin: none;
}
body {
margin: none;
width: 100vw;
height: 100vh;
}
.arrowcontrols {
margin-right: 5px;
margin-top: 10%;
margin-bottom: 10%;
}
#master-cube {
background-color: #FF0000;
height: 40px;
width: 40px;
}
<div id="master-cube"></div><img src="arrows/rightarrow.png" alt="Right Arrow" height="60vh" width="60vw" onclick="moveright()" class="arrowcontrols">
<img src="arrows/middlejumpsquare.png" alt="Jump Square" height="60vh" width="60vw" onclick="movejump()" class="arrowcontrols">
<img src="arrows/leftarrow.png" alt="Left Arrow" height="60vh" width="60vw" onclick="moveright()" class="arrowcontrols">
既然您在评论中询问它是如何工作的,它是:
您需要将其设置为翻译不同的金额。否则,如果你只是翻译它50px
,那么它总是翻译50px
(从原始位置),没有区别。
所以这就是为什么你需要将它翻译 100 像素或 150 像素等等。所以一种方法是有一个变量,并将其设置为 50,每次翻译时,将其翻译该数量,然后将 50 增加到 100,然后增加到 150,等等。
的使用
`translateX(${displacement}px)`
一些程序员可能会认为这样的变量不好,因为它在全局范围内,其他代码也可以更改它,并且他们会以某种方式将变量隐藏为私有变量。(实际上是通过在 JavaScript 中将其封闭在本地范围内。但现在不要担心。)
由于您似乎只是在编程,您还可以添加transition: all 1s
到移动对象以使其翻译更顺畅:
let displacement = 50;
function moveright() {
document.getElementById("master-cube").style.transform = `translateX(${displacement}px)`;
displacement += 50;
}
html {
margin: none;
}
body {
margin: none;
width: 100vw;
height: 100vh;
}
.arrowcontrols {
margin-right: 5px;
margin-top: 10%;
margin-bottom: 10%;
}
#master-cube {
background-color: #FF0000;
height: 40px;
width: 40px;
transition: all 1s;
}
<div id="master-cube"></div><img src="arrows/rightarrow.png" alt="Right Arrow" height="60vh" width="60vw" onclick="moveright()" class="arrowcontrols">
<img src="arrows/middlejumpsquare.png" alt="Jump Square" height="60vh" width="60vw" onclick="movejump()" class="arrowcontrols">
<img src="arrows/leftarrow.png" alt="Left Arrow" height="60vh" width="60vw" onclick="moveright()" class="arrowcontrols">
推荐阅读
- javascript - JS创建包含随机唯一数字的对象数组
- spring-boot - Spring Cloud Zuul 反向代理路由不适用于指定的版本和上下文路径休息应用程序
- r - 用另一列中的先前信息更改列中的数据
- vega-lite - Vega lite 中 y 轴的最小值
- java - java.lang.StackOverflowError ManyToMany: MapStruct - Spring Boot - Hibernate
- pandas - 时间列间隔过滤器
- twitter-bootstrap - 如何将自定义模板中的数据发布到谷歌表单
- cassandra - Janusgraph 后端表的布局
- r - 通过添加 0 扩展数据帧
- python - 在 Python 中搜索二维列表中的元素