老虎机同步 jQuery 动画不工作
Slot Machine simultaneous jQuery animation not working
我正在尝试为彩票创建老虎机效果。
目标号码已经设置好,因此一旦按下停止按钮,它就会停在该号码上。
插槽 1 一切正常。但是,如果我为插槽 2 和插槽 3 添加相同的代码,则会产生问题。
下面给出的是代码:
$(document).ready(function() {
s1 = 1;
s2 = 1;
s3 = 1;
num1 = 6;
num2 = 5;
num3 = 7; //Target for 3 slots
i = 100; //Top margin for animation
$('#start').click(function() {
animateslot(50, 0);
});
$("#stop").click(function() {
stopanimationslot1(50, 0);
});
});
function animateslot(d = 150, i = 0) {
i = i + 100;
$('#slot1').animate({
marginTop: -i
}, {
duration: d,
complete: function() {
$("#slot1").append("<h3>Column " + s1 + "</h3>");
s1++;
if (s1 > 9) {
s1 = 1;
}
console.log(s1);
animateslot(d, i);
}
});
//If below given code is added it doesn't work**
/*
$('#slot2').animate(
{
marginTop: -i
},
{
duration: d,
complete: function() {
$("#slot2").append("<h3>Column "+s2+"</h3>");
s2++;
if(s2>9){
s2 = 1;
}
console.log("s2="+s2);
animateslot(d, i);
}
}
);
*/
}
function stopanimationslot1(d = 150, i = 0, num = 1) {
$('#slot1').stop();
i = i + 100;
$('#slot1').animate({
marginTop: -i
}, d, function() {
if (Math.abs(i / 100) == num1) {
$('#slot1').clearQueue().stop(false, true);
console.log("finished");
} else {
$("#slot1").append("<h3>Column " + s1 + "</h3>");
s1++;
if (s1 > 9) {
s1 = 1;
}
stopanimationslot1(d + 50, i, num);
}
});
}
#slot1 h3,
#slot2 h3,
#slot3 h3 {
width: 100px;
height: 100px;
border: 1px solid #999;
margin: 0;
}
#slotmachine {
max-height: 100px;
overflow: hidden;
padding: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="javascript:(0);" id="start" class="btn btn-default">Start</a><br><br>
<a href="javascript:(0);" id="stop" class="btn btn-default">Stop</a><br><br>
<div class="container">
<div class="row" id="slotmachine">
<div class="col-sm-4" id="slot1">
<h3>Column 1</h3>
</div>
<div class="col-sm-4" id="slot2">
<h3>Column 1</h3>
</div>
<div class="col-sm-4" id="slot3">
<h3>Column 1</h3>
</div>
</div>
</div>
它没有按预期工作的原因在于animateslot(d, i);
。
按下开始后:
- 槽 1 完成并调用
animateslot()
- 槽 2 完成并且 也 调用
animateslot()
在下一个 "animation cycle" 中,该方法不会像以前那样 运行 一次,而是 两次 ,这会导致卡顿行为。每个周期的调用量都会以两倍的速度不断增长。
要解决此问题,请在所有动画完成后调用 animateSlot()
一次,或者将每个槽移动到它自己的函数中(animateSlot1()
、animateSlot2()
, ...).
最后的忠告:我不建议在每次旋转后添加一个新节点,因为这会导致性能下降。
我正在尝试为彩票创建老虎机效果。 目标号码已经设置好,因此一旦按下停止按钮,它就会停在该号码上。 插槽 1 一切正常。但是,如果我为插槽 2 和插槽 3 添加相同的代码,则会产生问题。
下面给出的是代码:
$(document).ready(function() {
s1 = 1;
s2 = 1;
s3 = 1;
num1 = 6;
num2 = 5;
num3 = 7; //Target for 3 slots
i = 100; //Top margin for animation
$('#start').click(function() {
animateslot(50, 0);
});
$("#stop").click(function() {
stopanimationslot1(50, 0);
});
});
function animateslot(d = 150, i = 0) {
i = i + 100;
$('#slot1').animate({
marginTop: -i
}, {
duration: d,
complete: function() {
$("#slot1").append("<h3>Column " + s1 + "</h3>");
s1++;
if (s1 > 9) {
s1 = 1;
}
console.log(s1);
animateslot(d, i);
}
});
//If below given code is added it doesn't work**
/*
$('#slot2').animate(
{
marginTop: -i
},
{
duration: d,
complete: function() {
$("#slot2").append("<h3>Column "+s2+"</h3>");
s2++;
if(s2>9){
s2 = 1;
}
console.log("s2="+s2);
animateslot(d, i);
}
}
);
*/
}
function stopanimationslot1(d = 150, i = 0, num = 1) {
$('#slot1').stop();
i = i + 100;
$('#slot1').animate({
marginTop: -i
}, d, function() {
if (Math.abs(i / 100) == num1) {
$('#slot1').clearQueue().stop(false, true);
console.log("finished");
} else {
$("#slot1").append("<h3>Column " + s1 + "</h3>");
s1++;
if (s1 > 9) {
s1 = 1;
}
stopanimationslot1(d + 50, i, num);
}
});
}
#slot1 h3,
#slot2 h3,
#slot3 h3 {
width: 100px;
height: 100px;
border: 1px solid #999;
margin: 0;
}
#slotmachine {
max-height: 100px;
overflow: hidden;
padding: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="javascript:(0);" id="start" class="btn btn-default">Start</a><br><br>
<a href="javascript:(0);" id="stop" class="btn btn-default">Stop</a><br><br>
<div class="container">
<div class="row" id="slotmachine">
<div class="col-sm-4" id="slot1">
<h3>Column 1</h3>
</div>
<div class="col-sm-4" id="slot2">
<h3>Column 1</h3>
</div>
<div class="col-sm-4" id="slot3">
<h3>Column 1</h3>
</div>
</div>
</div>
它没有按预期工作的原因在于animateslot(d, i);
。
按下开始后:
- 槽 1 完成并调用
animateslot()
- 槽 2 完成并且 也 调用
animateslot()
在下一个 "animation cycle" 中,该方法不会像以前那样 运行 一次,而是 两次 ,这会导致卡顿行为。每个周期的调用量都会以两倍的速度不断增长。
要解决此问题,请在所有动画完成后调用 animateSlot()
一次,或者将每个槽移动到它自己的函数中(animateSlot1()
、animateSlot2()
, ...).
最后的忠告:我不建议在每次旋转后添加一个新节点,因为这会导致性能下降。