Есть две возможные причины мерцания.
Первая из строки $('#slideShowBack').show();
.
Просто удалите эту строку, поскольку она ничего не делает, так как видимость #slideShowBack
никогда не изменяется.
Во-вторых, когда вы .show()
переднее изображение поверх заднего изображения.Даже если переднее изображение теперь совпадает с задним, оно может вызвать кратковременное мерцание.
Я бы подошел к проблеме немного иначе.
- Начните страницу HTML столько одно изображение (это семантически более значимо, поскольку второе изображение не видно ... вы также можете начать со всех изображений в DOM, но это другой подход).
- Вызов функции слайд-шоув первый раз с изображением № 2.
- Слайд-шоу - добавление нового изображения в DOM за текущим изображением
- Слайд-шоу - исчезновение текущего изображения с отображением нового изображения за ним.
- Слайд-шоу - Удалите только что поблекшее изображение из DOM.
- Слайд-шоу - После паузы вызовите слайд-шоу со следующим изображением
Я бы также включил все ваши переменные и функциив самоназванной анонимной функции, чтобы вы не загромождали глобальное пространство имен: (function() { /* Everything in here */ })();
.
Самое важное изменение в коде - это то, что я делаюНе внезапно .show()
изображение поверх другого изображения, поэтому нет никакого возможного источника мерцания.Я также использую функцию обратного вызова в .fadeOut()
.Это просто функция, которая вызывается после завершения замирания:
HTML:
<div id="slideShow">
<img src="images/1.jpg" />
</div>
Javascript:
// Contain all your functionality in a self calling anonymous
// function, so that you don't clutter the global namespase.
(function() {
// ------
// ###### Edit these.
// Assumes you have images in path named 1.jpg, 2.jpg etc.
var imagePath = "images";
var lastImage = 5; // How many images do you have?
var fadeTime = 4000; // Time between image fadeouts.
// ------
// ###### Don't edit beyond this point.
// No need for outer index var
function slideShow(index) {
var url = imagePath + "/" + index + ".jpg";
// Add new image behind current image
$("#slideShow").prepend($("<img/>").attr("src",url));
// Fade the current image, then in the call back
// remove the image and call the next image
$("#slideShow img:last").fadeOut("slow", function() {
$(this).remove();
setTimeout(function() {
slideShow((index % lastImage) + 1)
}, fadeTime);
});
}
$(document).ready(function() {
// Img 1 is already showing, so we call 2
setTimeout(function() { slideShow(2) }, fadeTime);
});
})();
Вызов следующей функции слайд-шоу:
Вместо index = (index == lastImage) ? 1 : index + 1;
вы можете использовать оператор модуля %
, чтобы получить остаток от деления, и вместо использования циклической переменнойВы должны установить вне функции slideShow()
, просто передать, какую фотографию вы хотите показать в качестве аргумента ... Затем вы можете вызвать следующий showImage в вашем setTimeout с помощью slideShow(current+1)
.На самом деле, slideShow((index % lastImage) + 1)
.Лучше использовать анонимную функцию или ссылку с setTimeout
вместо eval.