javascript - 为什么这些方块在 setInterval 内只翻译一次而不是多次?
问题描述
var initialCircle;
var i;
var randomXPos;
var randomYPos;
var colorArray;
var interval01;
var circleNodeList;
var circleNodeListIndividual;
var xDirection = 5;
var yDirection = 5;
var dX = xDirection + 5;
var dY = yDirection + 5;
colorArray = [
'aliceblue', 'lavender', 'powderblue', 'lightblue', 'lightskyblue', 'skyblue', 'deepskyblue', 'lightsteelblue', 'dodgerblue', 'cornflowerblue', 'steelblue', 'cadetblue', 'mediumslateblue', 'slateblue', 'darkslateblue', 'royalblue', 'blue', 'mediumblue', 'darkblue', 'navy', 'midnightblue', 'blueviolet', 'indigo'
];
var randomColor;
function startBouncingHoverCircles() {
interval01 = setInterval(function() {
randomXPos = Math.floor(Math.random() * 380) + 31;
randomYPos = Math.floor(Math.random() * 235) + 31;
randomColor = colorArray[Math.floor(Math.random() * colorArray.length)];
initialCircle = document.createElement('div');
document.querySelector("#container").appendChild(initialCircle);
initialCircle.className = "aces";
initialCircle.style = 'height:30px;width:30px;border-radius:50%;box-sizing:border-box;position:absolute;border:3px solid green;background-color:' + randomColor;
initialCircle.style.top = randomYPos + 'px';
initialCircle.style.left = randomXPos + 'px';
}, 1);
setTimeout(function() {
clearInterval(interval01);
movement()
}, 100)
}
function movement() {
setInterval(function() {
circleNodeList = document.querySelectorAll(".aces");
for (i = 0; i < circleNodeList.length; i++) {
circleNodeListIndividual = circleNodeList[i];
circleNodeListIndividual.style.transition = "transform 1s";
circleNodeListIndividual.style.transform = 'translate(' + dX + 'px' + ',' + dY + 'px' + ')'
}
}, 1500)
}
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/randomcolor/0.6.1/randomColor.min.js" integrity="sha512-vPeZ7JCboHcfpqSx5ZD+/jpEhS4JpXxfz9orSvAPPj0EKUVShU2tgy7XkU+oujBJKnWmu4hU7r9MMQNWPfXsYw==" crossorigin="anonymous"></script>
<style>
#container {
width: 450px;
height: 300px;
position: relative;
border: 1px solid black;
margin: auto;
}
</style>
</head>
<body>
<button onClick="startBouncingHoverCircles()">Start</button>
<div id="container"></div>
<script src="../Js/bouncingHoverCircles.js"></script>
</body>
</html>
我试图让这些球在撞到墙上时从墙上反弹并反转方向。第一步是为他们设置一个间隔,以便继续在屏幕上播放动画。我正在尝试在不实现画布的情况下完成此操作。关于为什么间隔只运行一次的任何帮助都会很棒。谢谢
解决方案
您的 setInterval 运行正常。
问题是您总是将圆圈再次放在同一点上。当你这样做'translate(' + dX + 'px' + ',' + dY + 'px' + ')'
-dX
和dY
不会添加到圆圈的当前位置。它们被用作新位置(始终保持 10 像素。)
2个解决方案:
每次调用都会增加
dX
和。dY
movement()
可能更好的解决方案:当您
transform
在元素中设置属性时 - 将当前位置与dX
和相加dY
。执行此操作的代码:transform
在移动函数中设置之前添加下一个变量:const matrix = new WebKitCSSMatrix(circleNodeListIndividual.style.transform);
然后在设置中使用它
transform
:circleNodeListIndividual.style.transform = 'translate(' + (matrix.m41 + dX) + 'px' + ',' + (matrix.m42 + dY) + 'px' + ')'
推荐阅读
- matlab - MATLAB R2016b 渲染问题:线条颜色与不应有的阴影
- javascript - Angular 6 组件对来自其他组件的 setTimeout 做出反应
- hadoop - 转储命令在猪中显示空括号
- apache-kafka - 将 apache kafka 与 Spring Cloud netflix 堆栈一起使用
- nuget - 我可以忽略这个关于没有 API KEY 的 nuget 警告吗?
- c# - 在 Unity 中执行长时间任务以不影响帧速率的正确方法
- php - 在 Woocommerce 中更改“新订单”电子邮件的回复标题
- ios - 2个collectionView在同一个ViewController,但是只有一个可以执行segue
- r - 只保留语料库中包含特定关键词的句子(在 R 中)
- html - 如何在没有标签重叠的情况下在换行符上插入段落标签?