Самый простой способ - сделать рекурсивный цикл, используя тайм-аут для задержки вызова. Доказательство концепции ниже:
var childDivs = document.querySelectorAll('.child');
function selectDivs(divs, index, delay) {
divs[index].classList.add('selected');
delay = delay || 1000; // if you want to change the delay
index++
if (index < divs.length) {
setTimeout(function() {
selectDivs(divs, index, delay);
}, delay);
}
}
.flex-container {
display: flex;
flex-wrap: wrap;
}
.child {
height: 100px;
width: 100px;
box-sizing: border-box;
background-color: yellow;
border: 1px solid #000;
}
.selected {
background-color: red;
}
<body onload="selectDivs(childDivs, 0)">
<div class="flex-container">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</body>
Я бы лично использовал CSS, насколько смог, установив CSS-переменную, чтобы задержать изменение. Только для того, чтобы иметь возможность следить за тем, что происходит легче в DOM.
var childDivs = document.querySelectorAll('.child');
function selectDivs(children) {
let child = {};
for (let i = 0; i < children.length; i++) {
child = children[i];
child.style.setProperty('--background-animation-delay', i+'s');
child.classList.add('selected');
}
}
.flex-container {
display: flex;
flex-wrap: wrap;
}
.child {
--background-animation-delay: 0s;
height: 100px;
width: 100px;
box-sizing: border-box;
background-color: #ffff00;
border: 1px solid #000;
transition: background-color 0s var(--background-animation-delay);
}
.selected {
background-color: #ff0000;
}
<body onload="selectDivs(childDivs)">
<div class="flex-container">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</body>