Применить стиль с помощью setTimeout()

Я создал следующий код:

  setTimeout(function () {
        var dot = document.querySelectorAll('.dot');
        for (var i=0;i<dot.length;i++) {
            dot[i].style.backgroundColor = 'blue';
        }
    },2000);
 .container{
        display: flex;
        justify-content: space-around;
    }
   .dot{
       background-color: red;
       width: 20px;
       height: 20px;
       border-radius: 50%;
   }
<div class = "container">
<div  class = "dot"></div>
<div class = "dot" ></div>
<div class = "dot" ></div>
</div>

Этот код применяет цвет фона для каждой точки одновременно через 2 секунды, но я хочу применить стиль для каждой точки отдельно. Например: через 2 секунды применить стиль для первой точки, затем через 2 секунды применить стиль для второй точки и так далее. У кого есть решение?

вы можете использовать setInterval

ControlAltDel 28.05.2019 20:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
68
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Самый простой способ — создать отдельные таймеры, сделав каждое ожидание на 2000 мс длиннее предыдущего, умножив его на индекс цикла:

var dot = document.querySelectorAll('.dot');
for (let i=0;i<dot.length;i++) { // ***
    setTimeout(function () {
        dot[i].style.backgroundColor = 'blue';
    }, i * 2000);
}

Обратите также внимание на использование let вместо var в цикле, так что каждая итерация цикла получает свою собственную копию i. Если вы не можете использовать функции ES2015, см. ответы на этот вопрос, чтобы узнать, как работать с i в цикле for.

Если мы используем ES2015, мы можем вместо этого использовать цикл for-of:

let i = 0;
for (const dot of document.querySelectorAll('.dot')) {
    setTimeout(() => {
        dot.style.backgroundColor = 'blue';
    }, i++ * 2000);
}

Это зависит от того, что NodeList из querySelectorAll можно повторять, как в современных браузерах. Я не знаю, есть ли какие-либо браузеры с ES2015, но которые (пока) не делают NodeList итерируемым; если они есть, вы можете использовать техника этого ответа для добавления итерируемости.

Поместите setTimeout внутри цикла for и умножьте i на 2000, чтобы установить другой интервал.

var dot = document.querySelectorAll('.dot');
for (let i = 0; i < dot.length; i++) {
  setTimeout(function() {
    dot[i].style.backgroundColor = 'blue';
  }, i * 2000);

}
.container {
  display: flex;
  justify-content: space-around;
}

.dot {
  background-color: red;
  width: 20px;
  height: 20px;
  border-radius: 50%;
}
<div class = "container">
  <div class = "dot"></div>
  <div class = "dot"></div>
  <div class = "dot"></div>
</div>
  var i = 0;
  var dot = document.querySelectorAll('.dot');
  var interval = setInterval(function () {
    dot[i].style.backgroundColor = 'blue';
    i++;
    if (i >= dot.length) clearInterval(interval);
  },2000);

Вы можете попробовать использовать длинный путь: ``` setTimeout (функция () { var dot = document.querySelectorAll('.dot');

    setTimeout(function () {
        for (var i=0;i<dot.length;i++) {
        dot[0].style.backgroundColor = 'blue';
        }

        setTimeout(function () {
            for (var i=0;i<dot.length;i++) {
            dot[1].style.backgroundColor = 'blue';
            }
        },2000);

    },2000);
},2000);    
</script>```

Но я бы предложил (i * 2000)

Попробуйте использовать setInterval, кажется, он идеально подходит для вашего случая.

    var dotNumber = 0;
    var myVar = setInterval(() => {
        var dot = document.querySelectorAll('.dot');
        dot[dotNumber].style.backgroundColor = 'blue';

        dotNumber +=1; 

        if (dotNumber >= dot.length){
           clearInterval(myVar);
        }  
     }, 2000);

Другие вопросы по теме