Ich versuche, diesen Code auszuführen, um eine Diashow von 3 Bildern zu machen, aber es funktioniert nicht richtig. Die Diashow wird einmal ausgeführt, stoppt dann aber ...setTimeout funktioniert nicht mit for-Schleife
Unten finden Sie meine JavaScript-, CSS- und HTML-Dateien. Wenn Sie das Code-Snippet ausführen, wird die Diashow einmal ausgeführt.
Der HTML deklariert im Grunde ein Container-Div mit den Folien als Divs mit einem bestimmten Hintergrundbild. (Für diese Frage habe ich die Bilder in Farben geändert, so dass Sie die Diashow in Aktion sehen können)
Die CSS deklariert die Position der einzelnen Bilder der Diashow, wenn sie gerade und ausgeblendet ist.
Das JavaScript durchläuft die Folien und gibt jedem eine Klasse von "versteckt", wenn sie sich aus dem Blickfeld bewegen sollen. Am Ende bringt es die erste Folie zurück, indem alle "versteckten" Klassen entfernt werden.
Ich bin ziemlich sicher, dass das Problem in der JavaScript mit der Funktion setTimeout ist, da jedes Mal, wenn ich die Funktionen in der Konsole ausführen funktioniert perfekt, aber wenn ich versuche, sie automatisch in JS ausgeführt wird es nur einmal ausgeführt.
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()' ist asynchron. Es blockiert die Ausführung erst, wenn der Timer ausgelöst wird. Stattdessen plant es nur einen Timer für eine zukünftige Zeit und setzt die Ausführung Ihres Javascript fort. Also planst du 300 Timer in deiner 'for'-Schleife, alles zu drei verschiedenen Zeiten. – jfriend00
Setzen Sie einige console.log-Anweisungen in Ihre slideAtoB-Funktionen und Sie werden sehen, dass Sie 100 Log-Anweisungen alle gleichzeitig erhalten. – morgancodes