Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вычисления в цикле срабатывают, не дожидаясь выполнения анимации (https://javascript.ru/forum/misc/75249-vychisleniya-v-cikle-srabatyvayut-ne-dozhidayas-vypolneniya-animacii.html)

Беляев Антон 16.09.2018 17:14

Вычисления в цикле срабатывают, не дожидаясь выполнения анимации
 
HTML:
<!DOCTYPE html>
<html lang="ru">
<head>
	<script type="text/javascript" src= "jquery.js"></script>
	<script type = "text/javascript" src = "script.js"></script>
	<link href = "style.css" rel = "stylesheet">
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id = "square"></div>
</body>
</html>


CSS:
Код:

#square{
        background-image: url(square.png);
        width: 68px;
        height: 68px;
        position: absolute;
}

JS:
$(document).ready(function(){
	for(var i = 0; i<3000; i++){													
	   				window.date = new Date;
	   				window.randomLeft = 0;
					$("#square").css("display", "relative");
					$("#square").animate({top: "578px"}, 5000);
					$("#square").animate({top: "22px"}, 0);
					window.milliseconds = date.getMilliseconds();
					milliseconds = date.getMilliseconds();
					if(milliseconds > 541){
						milliseconds = milliseconds - 459;
					}
					randomLeft = Math.round(Math.random() * milliseconds);
					$("#square").css("margin-left", randomLeft + "px");
				}
})


После того, как анимация падения квадрата выполняется, отступ слева (randomLeft) должен меняться. Но, так как все итерации проходят до того, как проиграется анимация, то ничего не происходит. Пробовал вместо цикла использовать setInterval, но тогда надо, что бы каждая итерация длилась столько же, сколько и анимация, а это сделать не получается. Не подскажите, как решить проблему?

j0hnik 16.09.2018 17:16

Беляев Антон,
вам подойдет рекурсивный setTimeout

рони 16.09.2018 17:56

Беляев Антон,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  #square{
	background-image: url(https://fastweb.it/area-clienti-aziende/gfx/form/error_icn.png);
	width: 68px;
	height: 68px;
	position: absolute;
}
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
    var a = 3000,
        b = $("#square");
    ! function c() {
        a-- && b.css({
            "margin-left": Math.round(541 * Math.random()) + "px",
            top: "22px"
        }).animate({
            top: "578px"
        }, 5000, c)
    }()
});

  </script>
</head>

<body>
<div id = "square"></div>

</body>
</html>

Беляев Антон 16.09.2018 19:13

Я только недавно начал изучать js. Не подскажите, что происходит в строке 22?

MC-XOBAHCK 16.09.2018 19:33

Цитата:

Сообщение от Беляев Антон (Сообщение 494815)
что происходит в строке 22?

Там переменная a уменьшается на 1 и к переменной b присваиваются инлайново стили CSS (они 23, 24 строчка).

А вот что делает восклицательный знак (оператор НЕ) в 21-строке, вот тут и мне интересно.

рони 16.09.2018 19:44

Цитата:

Сообщение от MC-XOBAHCK
А вот что делает восклицательный знак

тоже самое что (function(){})() создание фунции и сразу её выполнение

рони 16.09.2018 19:45

Цитата:

Сообщение от Беляев Антон
Не подскажите, что происходит в строке 22?

если а не равно нулю запустить анимацию

MC-XOBAHCK 16.09.2018 20:36

Цитата:

Сообщение от рони (Сообщение 494818)
тоже самое что (function(){})() создание функции и сразу её выполнение

Спасибо за разъяснение, не знал что так можно.

рони 16.09.2018 20:49

Цитата:

Сообщение от MC-XOBAHCK
Спасибо за разъяснение, не знал что так можно.

там ещё пять способов!
http://javascript.ru/forum/showthread.php?p=341474


Часовой пояс GMT +3, время: 08:15.