Это происходит потому, что ваш обратный вызов "on animation end" вызывает light()
и shutdown()
для каждого элемента, который имеет класс all_divs
(3 раза каждый раз).Одним из способов решения этой проблемы является вызов light()
и shutdown()
только для последнего элемента.
function light() {
$(".all_divs").animate({opacity: 1}, 500, function(i) {
if (this === $(".all_divs").last().get(0))
shutdown();
});
}
function shutdown() {
$(".all_divs").animate({opacity: 0}, 500, function() {
if (this === $(".all_divs").last().get(0))
light();
});
}
$(document).ready(function() {
light();
});
.all_divs {
width: 100px;
height: 100px;
background: #009;
margin-top: 10px;
opacity: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="my_div" class="all_divs" ></div>
<div class="all_divs" ></div>
<div class="all_divs" ></div>
Или вы можете сохранить последний элемент где-нибудь, чтобы вам не пришлось его пересчитывать.
function light() {
$(".all_divs").animate({opacity: 1}, 500, function(i) {
if (this === App.lastAnimatedElement)
shutdown();
});
}
function shutdown() {
$(".all_divs").animate({opacity: 0}, 500, function() {
if (this === App.lastAnimatedElement)
light();
});
}
var App = App || {};
$(document).ready(function() {
App.lastAnimatedElement = $(".all_divs").last().get(0);
light();
});
.all_divs {
width: 100px;
height: 100px;
background: #009;
margin-top: 10px;
opacity: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="my_div" class="all_divs" ></div>
<div class="all_divs" ></div>
<div class="all_divs" ></div>