Я пытаюсь запустить этот код, чтобы сделать слайд-шоу из 3 изображений, но он не работает должным образом. Слайд-шоу запускается один раз, но затем просто останавливается ...setTimeout функция не работает с петлей
Ниже приведены мои JavaScript, CSS и HTML, и если вы запустите фрагмент кода, вы увидите, что показ слайдов запускается один раз.
HTML в основном объявляет контейнер div со слайдами как divs с определенным фоновым изображением. (Для этого вопроса я изменил изображения на цвета, чтобы вы могли видеть слайд-шоу в действии)
CSS объявляет положение каждого из изображений слайд-шоу, когда оно находится на виду и когда оно скрыто.
JavaScript циклически проходит через слайды, давая каждому из них класс «скрытых», когда они должны выходить из поля зрения. В конце он возвращает первый слайд, удаляя все «скрытые» классы.
Я уверен, что проблема связана с JavaScript с помощью функции setTimeout, поскольку всякий раз, когда я запускаю функции в консоли, она отлично работает, но когда я пытаюсь автоматически их запускать в моем JS, она запускается только один раз.
function slide1to2(){
\t document.getElementById('slide1').className = "hidden";
\t clearTimeout(s1to2);
}
function slide2to3(){
\t document.getElementById('slide2').className = "hidden";
\t clearTimeout(s2to3);
}
function slide3to1(){
\t document.getElementById('slide1').className = "";
\t document.getElementById('slide2').className = "";
\t clearTimeout(s3to1);
}
for(i=0; i<100; i++){
\t s1to2 = window.setTimeout(slide1to2, 2000);
\t s2to3 = window.setTimeout(slide2to3, 4000);
\t s3to1 = window.setTimeout(slide3to1, 6000);
}
div#slideshow{
\t width:100%;
\t height:50%;
\t background-image:url("white-wall.png");
}
div#slideshow div{
\t width:100%;
\t height:inherit;
\t background-repeat:no-repeat;
\t background-position:center;
\t background-color:rgba(0,0,0,0.5);
\t position:absolute;
\t transition:1s;
}
div#slideshow div[id$="1"]{
\t background:#FF8888;
\t transform:translateX(0%);
\t z-index:3;
}
div#slideshow div[id$="2"]{
\t background:#88FF88;
\t transform:translateX(0%);
\t z-index:2;
}
div#slideshow div[id$="3"]{
\t background:#8888FF;
\t transform:translateX(0%);
\t z-index:1;
}
div#slideshow div[id$="1"].hidden{
\t transform:translateX(-100%);
}
div#slideshow div[id$="2"].hidden{
\t transform:translateX(-100%);
}
<div id="slideshow">
\t <div id="slide1"></div>
\t <div id="slide2"></div>
\t <div id="slide3"></div>
</div>
'SetTimeout()' является асинхронным. Он не блокирует выполнение до срабатывания таймера. Вместо этого он просто планирует таймер в течение некоторого будущего времени и продолжает выполнение вашего javascript. Таким образом, вы планируете 300 таймеров в вашем цикле 'for', все в три раза. – jfriend00
Поместите некоторые операторы console.log внутри ваших функций slideAtoB, и вы увидите, что все 100 операторов журналов вы получаете в одно и то же мгновение. – morgancodes