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

  • 17.12.2010 Ирина:

    Да я просто копирнула,, подставила свои рисунки, убрала лефт-маргин и всё собстна... ((

  • 15.01.2011 vussia:

    Здравствуйте! Спасибо за информацию. Подскажите где над кодом нужно работать чтобы не один блок менял картинки, а на пример, был бы ряд из нескольких ячеек, и в каждой бы менялись картинки?

  • 23.01.2011 nikitos_one:

    Здавствуйте, спасибо за ваш материал, очень хороший слайдер. Только у меня тоже проблема с размещением нескольких таких блоков, возможно ли их разместить так, чтобы во всех одновременно менялись картинки. Я пробовал менять id и ставить цикл, но ничего не получается.

  • 23.01.2011 nikitos_one:

    Я решил проблему со сменой картинок в нескольких контейнерах одновременно. Чуть позже выложу

    • 23.01.2011 Кирилл:

      Ок, Никитос, опиши, плиз, в двух словах как решил, думаю Росииянам! может пригодится :) .

  • 23.01.2011 nikitos_one:

    я добился работы нескольких таких слайдеров, вот как:

    css настройки изменились незначительно, вместо знака #(решетка) ставится знак .(точка):

    div .rotator 
    {
    	position:relative; 
    	height:150px; 
    }
    div .rotator ul li 
    {
    	float:left;
    	position:absolute; 
    	list-style: none;
    }
    div .rotator ul li .show 
    {
    	z-index:500;
    }

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

    function theRotator() 
    {
    	var len = $('div.rotator').length;
    	for (var i=0; i<len; i++) 
    	{
    		$('div.rotator:eq('+i+') ul li').css({opacity: 0.0}); $('div.rotator:eq('+i+') ul li:first').css({opacity: 1.0});
    	}
    	setInterval('rotate('+len+')',3000);
    }
    function rotate(len) 
    {
    	for (var i=0; i<len; i++) 
    	{
    		var current = ($('div.rotator:eq('+i+') ul li.show')?  $('div.rotator:eq('+i+') ul li.show') : $('div.rotator:eq('+i+') ul li:first'));
    		var next = ((current.next().length) ? ((current.next().hasClass('show')) ? $('div.rotator:eq('+i+') ul li:first') :current.next()) : $('div.rotator:eq('+i+') ul li:first'));
    		next.css({opacity: 0.0}).addClass('show').animate({opacity: 1.0}, 1000);
    		current.animate({opacity: 0.0}, 1000).removeClass('show');
    	}
    };
    $(document).ready(function() {theRotator();});

    теперь можно добавлять сколько угодно блоков в заданном ниже формате, от исходного кода отличается лишь тем, что добавлено свойство class="rotator" к div-у c id="rotator"

       <a href="http://google.ru/" rel="nofollow"><img src="images/image-1.jpg" width="500" height="313"  alt="pic1" /></a>
       <a href="http://yandex.ru/" rel="nofollow"><img src="images/image-2.jpg" width="500" height="313"  alt="pic1" /></a>
       <a href="http://nigma.ru/" rel="nofollow"><img src="images/image-3.jpg" width="500" height="313"  alt="pic1" /></a>

    либо третья часть кода в картинках

    если собрать 3 части кода вместе, заменить в последней части пути к изображениям, то получится рабочий образец.

    пользуйтесь на здоровье

    • 08.02.2011 Илья:

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

      nikitos_one. Пожалуйста, если вам не трудно помогите мне соединить 3 кусочка в один целый, как например в самой статье. Пытался сделать это собсвенными силами — не получилось. Помогите пожалуйста!

      • 09.02.2011 Кирилл:

        Илья, тут тупых нет :) . Обратитесь кстати к Евгению, у него в магазине вроде-бы реализовано то, что вам требуется.

  • 24.01.2011 Кирилл:

    Никитос, отбой, из почты достал последний блок, еще раз спасибо, найденное решение оформил. :)

    • 27.08.2011 Sanek:

      Кирилл вы, вроде, писали что получили у третий блок по почте и оформили его (я об скрипте который выводит несколько таких блоков на одной странице) Что я не делаю не получается этот вариант скрипта запустить. Не могли бы выложить его или указать где этот скрипт работает?

    • 27.08.2011 Sanek:

      Все разобрался, жаль у вас нет возможности редактировать свои комментарии до модерации.

      • 27.08.2011 Кирилл:

        Санек, я честно не в курсе о чем речь, но здорово что удалось разобраться, на самом деле редактирование комментов в WP до публикации я не встречал, да и я их сам редактирую, если они адекватные :)

  • 26.01.2011 Mona:

    А скорость смены картинок в нем можно устанавливать? Не вижу, где это, пардон. )

    • 27.01.2011 Кирилл:

      Привет Мона.

      Тут интервал между сменами.

      // Вызываем функцию rotate для запуска слайдшоу, 5000 = смена картинок происходит раз в 5 секунд

      setInterval('rotate()',5000);

      Тут скорость появления/исчезания:

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

  • 28.01.2011 goldfinfish:

    Спасибо, работает!

  • 30.01.2011 Harley:

    Скрипт отличный, работает норм, но вот я что-то не понял некоторых вещей:

    1. Почему картинки смещаются вправо, как его отцентрировать. Убирал всё, что только можно — нифига.

    2. Как его вообще поставить в шапку сайта. Как в неё попасть ?

    3. Как сделать так, чтобы отображаемые в скрипте картинки работали как фон в шапке, а поверх этого меняющегося фона я мог бы наложить постоянные картинки. То есть, таблица шапки сайта разбита на две ячейки. Вот нужно установить меняющийся фон таблицы, а в ячейках стоят картинки, которые не меняются и отображаются поверх фона, ну или поверх этого скрипта... Это возможно с этим скриптом ?

    • 30.01.2011 Кирилл:

      Этот скрипт предназначен скорее для более простых применений. Если вы делаете сайт на одной из популярных CMS то проще будет найти подходящий готовый модуль.

      • 01.02.2011 Виталик:

        Это видимо вы сейчас про джумлу? найти модуль и любоваться на тонны ненужного кода. Хочешь что-то качественное и легкое — пиши ручками и будет счастье=)

        • 01.02.2011 Кирилл:

          В модулях джумлы сложно найти лишний код в силу их простоты, но я имел ввиду другое — если есть жесткие временные рамки то быстрее найти подходящий модуль, выпилить из него лишнее и не изобретать велосипед, хотя это иногда занятно.

  • 03.02.2011 Алла:

    Здравствуйте, вариант с одним блоком работает, а вот с несколькими нет. Пишет ошибку «missing ) after for-loop control» (((((

    • 03.02.2011 Кирилл:

      Привет, Алла, думаю вам стоит скооперироваться с Никитосом, он в своем комментарии описал способ, как сделать несколько меняющихся изображений.


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

 css.php