Простой скрипт плавной смены картинок на 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

  • 28.04.2012 Виталий:

    Есть один мааленький нюанс этого маленького и легкого скрипта. Посмотрите на загрузку процессора — на моем Ci5 в момент перерисовки картинок показатель ЦП подскакивает на 7-8%. Это очень плохо. Ротаторы на Flash грузят ЦП значительно меньше. Еще в связи с распространением css3 набирают моду т.н. «pure css3 slider», но они грузят ЦП вообще по-черному. Вот вам пример www.joelambert.co.uk/flux/

  • 21.05.2012 Сергей:

    Скрипт работает, но никак не могу сделать обтекание объекта текстом. Может у кого есть решение?

    • 21.05.2012 Кирилл:

      Напишите как уже пробовали?

      • 21.05.2012 Сергей:

        Добавлял в свойства объекта

        еще создавал отдельную ячейку в таблице для объекта

        • 24.05.2012 Кирилл:

          Похоже, вот тут forum.ixbt.com/topic.cgi?id=24:46040, уже описано рабочее решение :)

          • 25.05.2012 Сергей:

            Как тесен мир, это моя же ссылка:)

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

          • 25.05.2012 Кирилл:

            Может быть в этой ситуации может помочь z-index?

  • 29.05.2012 gala:

    Спасибо, очень нужный скрипт. Есть странная проблема — нормально работает в IE, Opera, Chrome, Safari И только FireFox рапортует «theRotator is not defined». Что его так глючит? : ( Подскажите, плс

    • 30.05.2012 Сергей:

      У меня в фоксе чистенько работает

  • 08.06.2012 Сергей:

    А в joomla работать будет? Что там с jQuery, как его подключить то? Или он по умолчанию на все страницы уже подключен?

    Да, за скрипт, спасибо огромное, не пришлось самому придумывать как всё это реализовать!

  • 08.06.2012 Сергей:

    Всё, разобрался, работает! jQuery подключил стандартно, указав путь к загруженному на сервер файлу.

    Единственно, пока не получается убрать маркер списка установленный самим шаблонам, даже «!important» не помогает...

    Но ведь можно добавить новый класс и чуть подправить css шаблона =)

    Ещё раз автору спасибо.

    А кому интересно смотрите (вывел через модуль «Произвольный HTML-код»): ilyc.ru/site4/

  • 03.07.2012 Вадим:

    Как убрать цикличность? мне нужно чтоб с 1 по последнюю картинку 1 раз проматывал...

    • 03.07.2012 Кирилл:

      Попробуйте строку:

      setInterval('rotate()',5000);

      заменить на:

      rotate();

      т.е. вызвать один раз.

      • 03.07.2012 Вадим:

        Спасибо, а по середине страницы как то можно разместить этот сладшоу к примеру как здесь gif анимация в фоновом изображении страницы nastenke.narod.ru/life

      • 03.07.2012 Вадим:

        setInterval('rotate()',5000); это время 5 скунд смена слайдов поменял как сказали они вообще не перематываются.

  • 03.07.2012 Вадим:

    Как разместить эти слайды в середине страницы? Не как не могу понять...

  • 03.07.2012 Вадим:

    Как для каждой картинки отдельный интервал времени поставить?

  • 16.07.2012 Сергей:

    У меня сначала три раза мигает первая картинка, затем начинается смена. Как от этого избавиться?

    • 17.07.2012 Сергей:

      Вопрос снят, сам накосячил. Извиняюсь...

  • 18.07.2012 Астэр:

    Здравствуйте, вставил скрипт на сайт, а можно добавить возможность пользователю выбирать картинки? Например при помощи точек, чтобы не ждать пока все промигают, если хочется сразу посмотреть к примеру 4-ую?

    • 18.07.2012 Кирилл:

      Привет, лучше поискать более подходящий скрипт :) честно, их на самом деле куча, как голых типа описанного, так и оформленных в модули к различным CMS.


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

 css.php