好吧,部分关键是参数化所有必需的细节 - 也就是说,如果您决定使用单个图像并更改,请不要硬编码输出容器的 id 或目标图像元素的 id它的来源。
- 某些方法使用无序列表并设置它(使用 css),因此只有第一项可见。然后更改幻灯片就变成了在其容器内移动
li 项目的问题。即,如果一个人在父项上调用appendChild 并使用第一个li 项目作为参数,它将被隐藏,因为它现在是最后一个li 项目,第二个项目现在将是第一个项目,这将是显示的项目.
虽然第二种方法更直接一些,但第一种方法的好处是 (0) 不需要知道或关心有多少图像 - 您只需将第一个 li 项目移动到最后一个,或者将最后一个移到第一个,并且 (1) 所有图像都在开始时加载,因此您不会有一点延迟,因为每张幻灯片都是第一次显示并加载。
- 其他方法会更改图像元素的 src。
我在这里使用了第二个。我没有为上一个/下一个按钮而烦恼——这可能意味着这个答案目前超出了你的范围。我会在 startSlideshow 函数中添加 prev/next 函数并返回函数本身 - 即 return this;,而不是计时器的 id(这是为了允许它通过 clearInterval 停止)
JS
function newEl(tag){return document.createElement(tag)}
function byId(id){return document.getElementById(id)}
window.addEventListener('load', onDocLoaded, false);
function onDocLoaded(evt)
{
var slideshow1TimerId = startSlideshow( ['uqrsGpO.jpg', 'vote-pedro.jpg'], 'slide1', 3000 );
var slideshow2TimerId = startSlideshow( ['zS0lOud.jpg', 'tree.png', 's13.bmp'], 'slide2', 1000 );
}
function startSlideshow(imgNameArray, idOfContainer, msPerSlide)
{
var container = byId(idOfContainer);
var tgtImgElem = newEl('img');
container.appendChild(tgtImgElem);
var timerId = setInterval(setSlideImg, msPerSlide);
var slideIndex = 0;
var numSlides = imgNameArray.length;
function setSlideImg()
{
tgtImgElem.src = imgNameArray[slideIndex];
slideIndex++;
if (slideIndex >= numSlides)
slideIndex = 0;
}
return timerId;
}
CSS
#slide1 img, #slide2 img
{
height: 128px;
}
HTML
<div id='slide1'></div>
<div id='slide2'></div>