Первое, о чем вы должны знать, и это должно вызывать проблемы с вашим кодом: методы animate не являются синхронными! Итак, когда вы делаете:
$('#home-slideshow img').animate({opacity: 0}, delay);
// now, the background is visible
// next change the url on the img
$('#home-slideshow img').attr('src', slideshow_images[slideshow_index]);
Вы начинаете анимировать, но метод сразу возвращается. Вы можете представить анимацию как фоновый поток, хотя в JavaScript нет такого понятия, как поток, и все реализовано с помощью вызовов settimeout.
Таким образом, в вашем коде, в момент изменения атрибута src, изображение, вероятно, все еще остается видимым на 99%. И затем вы начинаете анимировать его обратно до 100% непрозрачности, но в этот момент он все еще составляет, скажем, 98%, и два «потока» будут пытаться одновременно заставить его появиться / исчезнуть!
Таким образом, в вашем коде потребуется либо установить таймауты для выполнения задач в правильном порядке (всегда оставляя интервал между запасами в несколько миллисекунд), либо, более безопасный, но, возможно, менее читаемый, когда у вас много последовательных вызовов функций, используйте обратный вызов функция одушевленного метода. Например:
$('#home-slideshow img').animate({opacity: 0}, delay, function(){
// now, the background is visible
// next change the url on the img
$('#home-slideshow img').attr('src', slideshow_images[slideshow_index]);
// and fade it up
$('#home-slideshow img').animate({opacity: 1.0}, delay, function(){
// do it again
setTimeout('swapSlides()', 4000);
});
});
Наконец, то, что вы делаете, это постепенное исчезновение + постепенное увеличение. Если вы хотите настоящее перекрестное постепенное исчезновение, вам нужно иметь одновременно 2 элемента:
- начало: есть только один элемент с непрозрачностью 100%
- создайте новый элемент с правильным URL-адресом для фонового изображения (или используйте элемент img)
- добавить новый элемент в dom-дерево с непрозрачностью 0%, как родственный элемент к существующему
- начать анимацию одновременно непрозрачности текущего элемента от 100% до 0% и непрозрачности нового элемента от 0% до 100%
- удалить старый, теперь невидимый элемент