Простой скрипт плавной смены картинок на JQuery

Иногда в текст текст html-страницы сайта требуется внедрить меняющиеся изображения. Реализовывать такую ротацию картинок с помощью GIF или Flash-анимации неудобно и не универсально (т.к. в случае необходимости замены одной из картинок придется «перерисовывать» весь файл микро-галереи), поэтому кажется очевидным необходимость применения JavaScript и одного из его фреймворков – JQuery.

Рассмотрим простейший вариант реализации смены изображений с использованием JQuery без использования его дополнительных плагинов.

Необходимые характеристики скрипта:

  • Последовательная смена изображений с ссылками на них.
  • Правильный код XHTML.
  • Минимальный размер кода.

В итоге мы получим плавную смену заранее заданного списка изображений с эффектом растворения.

Рассмотрим исходный код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Простая замена картинок с помощью JQuery</title>
 
<style type="text/css">
div#rotator {position:relative; height:150px; margin-left: 15px;}
div#rotator ul li {float:left; position:absolute; list-style: none;}
div#rotator ul li.show {z-index:500;}
</style>
 
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
 
<!-- Автор Dylan Wagstaff, http://www.alohatechsupport.net -->
<script type="text/javascript">
 
function theRotator() {
	// Устанавливаем прозрачность всех картинок в 0
	$('div#rotator ul li').css({opacity: 0.0});
 
	// Берем первую картинку и показываем ее (по пути включаем полную видимость)
	$('div#rotator ul li:first').css({opacity: 1.0});
 
	// Вызываем функцию rotate для запуска слайдшоу, 5000 = смена картинок происходит раз в 5 секунд
	setInterval('rotate()',5000);
}
 
function rotate() {	
	// Берем первую картинку
	var current = ($('div#rotator ul li.show')?  $('div#rotator ul li.show') : $('div#rotator ul li:first'));
 
	// Берем следующую картинку, когда дойдем до последней начинаем с начала
	var next = ((current.next().length) ? ((current.next().hasClass('show')) ? $('div#rotator ul li:first') :current.next()) : $('div#rotator ul li:first'));	
 
	// Расскомментируйте, чтобы показвать картинки в случайном порядке
	// var sibs = current.siblings();
	// var rndNum = Math.floor(Math.random() * sibs.length );
	// var next = $( sibs[ rndNum ] );
 
	// Подключаем эффект растворения/затухания для показа картинок, css-класс show имеет больший z-index
	next.css({opacity: 0.0})
	.addClass('show')
	.animate({opacity: 1.0}, 1000);
 
	// Прячем текущую картинку
	current.animate({opacity: 0.0}, 1000)
	.removeClass('show');
};
 
$(document).ready(function() {		
	// Запускаем слайдшоу
	theRotator();
});
 
</script>
 
</head>
<body>
 
<div id="rotator">
  <ul>
    <li class="show"><a href="http://google.ru/"><img src="images/image-1.jpg" width="500" height="313"  alt="pic1" /></a></li>
    <li><a href="http://yandex.ru/"><img src="images/image-2.jpg" width="500" height="313"  alt="pic2" /></a></li>
    <li><a href="http://nigma.ru/"><img src="images/image-3.jpg" width="500" height="313"  alt="pic3" /></a></li>
  </ul>
</div>
 
</body>
</html>
Пример работы:

  • pic1
  • pic2
  • pic3

 

Использован метод: http://www.alohatechsupport.net/webdesignmaui/maui-web-site-design/easy_jquery_auto_image_rotator.html с небольшими уточнениями.

Комментариев: 292

  • 10.03.2011 smail:

    Здравствуйте, спасибо большое за материал, все работает с одним НО: смена картинок стоит в шапке сайта и эти картинки меняются только при переходе на другую страницу =( Почему так происходит и как это можно исправить?

    Подскажите пожалуйста...

    • 10.03.2011 Кирилл:

      Привет, скрипт не завязан на свое место применения, может у вас просто стоит очень большой интервал смены картинки и вы не успеваете дождаться? ))

  • 19.03.2011 Леха:

    Благодарю!

  • 21.03.2011 Игорь:

    а для 15 изображений он пойдёт?

    и где можно поменять путь к картинкам?

    И можно ли сделать без списка, а просто в теге

    • 21.03.2011 Кирилл:

      1. Теоретически да, надо попробовать.

      2. В html-части примера.

      3. JS-часть ищет по элементам списка <li> — надо переписывать.

  • 21.03.2011 Игорь:

    Рассказываю...

    Данный скрипт меня просто спас... Он работает отлично с 15-ью изображениями... и мне кажется что это не предел...

    Автору огромный ПЛЮС...

  • 23.03.2011 arris:

    Огромное спасибо за скрипт, работает все нормально и великолепно!!!Подскажите, можно-ли остановить «шоу» на последнем фото???Скрипт меняет все фото и останавливается на последнем!!!

    • 23.03.2011 Кирилл:

      Спасибо за спасибо, для остановки проигрывания на последней картинке попробуйте сделать так:

      поменяйте строку

      setInterval('rotate()',6000);на

      var rotate; rotate = setInterval('rotate()',6000);теперь поменяйте

      var next = ((current.next().length) ? ((current.next().hasClass('show')) ? $('div#rotator ul li:first') :current.next()) : $('div#rotator ul li:first'));на

      var next = ((current.next().length) ? ((current.next().hasClass('show')) ? $('div.rotator ul li:first') :current.next()) : clearInterval(rotate));

  • 31.03.2011 Александр:

    Мне человеку, который два месяца назад начал во всем этом разбираться, скрипт очень помог! Спасибо!

    Я правда с трудом справился с отклонением изображения, не мог выровнять блок как надо, было отклонение вниз и в вправо, пришлось margin-ом padding-ом двигать. (может есть лучше лекарство от этой проблемы?)

    И еще вопрос: возможно ли замедлить переход от картинки к картинке? (сделать более долгий и плавный переход).

    Заранее Спасибо за ответ!!! )))

    • 31.03.2011 Кирилл:

      1. На вскидку лучше решения не подскажу, однако если в основных браузерах выглядит одинаково то стоит ли искать?

      2. Для замедления попробуйте поменять 1000 тут:

      .animate({opacity: 1.0}, 1000);

      • 01.04.2011 Александр:

        1. ну не совсем одинаково ))) как всегда эксплорер подвел, пришлось каждому создавать отдельный стиль. Да и вот вопрос, 6-ому и 7-ому EI стили создал, а вот с 8 как-то не получилось(на пару пиксилей отклонение), для 8-ого какой код перед стилем надо вводить?

        2.Спасибо, позже проверю )))

        • 01.04.2011 Кирилл:

          1. Насколько я помню, для таких случаев (детектирования Internet Explorer и его версии) используют т.н. Conditional Comments, 8-ую версию в том числе.

          • 08.04.2011 Александр:

            Еще разок спасибо =) вот конечный результат... http://www.art-studija.ru/

    • 27.09.2011 Blumberg:

      Проблема сдвига решается удалением отовсюду упоминания ul и теги тоже удаляем.

      Позиционируется без него — без проблем!!!

  • 01.04.2011 t:

    Здравствуйте, возникла такая проблема — на странице имеется 3 блока с картинками. Необходимо,что бы картинки менялись в каждом блоке. Но меняются они почему то только в одном. В остальных двух ничего не происходит. Хотя картинки помещены в тот же div, в те же списки. В чем может быть проблема?

  • 08.04.2011 Alexandr:

    Добрый день! Спасибо за скрипт. Но у меня возникла проблема, слайд шоу останавливается на 2 слайде, такая проблема только при внедрении кода в мою страницу, может конфликт с другим скриптом, подскажите пожалуйста.

  • 13.04.2011 onik:

    аге как и все жиквари не любит другие библиотеки...

    jQuery.noConflict(); никуда(((

  • 15.04.2011 Виталий:

    скрипт просто отличный, только одна проблема не получается поменять размещении картинки помогите пожалуйста...


Добавление комментария:

 css.php