我试图运行此代码,使幻灯片的3个图像,但它不能正常工作。幻灯片放映只运行一次,但随后停止...setTimeout函数不适用于循环
以下是我的JavaScript,CSS和HTML,如果您运行代码片段,您将看到幻灯片放映运行一次。
HTML基本上是声明一个容器div与幻灯片divs wth特定的背景图像。 (对于此问题,我将图像更改为颜色,以便您可以看到幻灯片的实际使用情况)
CSS声明幻灯片的每个图像在普通视图和隐藏时的位置。
JavaScript在幻灯片中循环,当每个幻灯片应该移出视图时,每个幻灯片都会有一类“隐藏”。最后,它通过删除所有“隐藏”类来带回第一张幻灯片。
我很确定问题出在带有setTimeout函数的JavaScript中,因为每当我在控制台中运行它的功能时,它都能正常工作,但是当我尝试自动设置它们在我的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。所以你在3个不同的时间安排了300个定时器。 – jfriend00
在slideAtoB函数中加入一些console.log语句,您会看到在同一时刻所有日志语句都会得到。 – morgancodes