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

  • 25.07.2012 Владимир:

    А этот скрипт, как я понимаю, работает только с 3-мя изображениями?. Никто не знает можно ли вот таким способом вытаскивать следующий элемент, а если последний, то брать первый:

    var massivLi = $('#rotator ul li');

    var next;

    if(!next:last){

    for(i=0; i < massivLi.length; i++){

    next = next[i].next();

    }

    else {

    next = current;

    }

    }

  • 25.07.2012 Владимир:

    Нет, нет работает. Подскажите кто-нибудь, пожалуйста, что значит адская конструкция:

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

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

    Спасибо большое! Скрипт отлично работает. А подскажите пожалуйста, как изменить код, чтобы картинки, которые меняются в шапке не перекрывали собой логотип сайта? Т.е. чтобы сменяющиеся картинки были background-ом шапки.

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

      Разобрался с помощью z-index

  • 13.10.2012 Валерий:

    Скрипт работает только на том браузере и компе, где его устанавливаешь и сохраняешь в index.html на хосте. Почему картинки не отображаются в других браузерах и компах? Вместо картинок черные окна.

    • 14.10.2012 Кирилл:

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

      • 14.10.2012 Валерий:

        прписан путь верно, ибо картинки открываются и сменяют др. др. Но открываются лишь в браузере на том, на каком именно сохранял код в index.htm. открывая на другом браузере не просматриваются до тех пор, пока вновь не сохранишь страницу index.htm, где прописан код с картинками

        • 14.10.2012 Кирилл:

          Не совсем понял про сохранение кода в браузере (я чаще сохраняю в каком-нибудь notepad++) однако открываются ли они в условно втором браузере если вставить в адресную строку ссылку на них из исходного кода?

          • 14.10.2012 Валерий:

            вот в браузере, в котором работаю и сохраняю страницу index.html на хосте, открываются. а в другом браузере не открываются. откроются лишь тогда в другом браузере, когда в нем нажмешь вновь «сохранить» страницу index.html. В чем причина, не понятно)))

  • 14.10.2012 Сергей:

    Уважаемый Кирилл!

    Чтобы этот скрипт использовать кроссбраузерно — чтобы он плавал, а не имел фиксированного положения я задал отступы:

    div#rotator {position:relative; width:500px; height:313px; margin-left: -42px; margin-top: -16px;}

    А затем скрипт заключил в таблицу:

    table border="0" width="500" height="313" cellspacing="0" cellpadding="0"> tr> td>

    div id="rotator">

    ul>

    li> class="show" img src="1.jpg" width="500" height="313"/> /li>

    li> img src="2.jpg" width="500" height="313"/> /li>

    li> img src="3.jpg" width="500" height="313"/> /li>

    li> img src="4.jpg" width="500" height="313"/> /li>

    /ul>

    /div> /td> /tr> /table>

    В результате при выделении скрипта, подобно тексту, я получил слева и снизу синие поля! Скрин здесь: s018.radikal.ru/i528/1210/c8/0c24bb77e6eb.jpg

    Мои вопросы к вам:

    1) Правильно ли я поступил?

    2) Как убрать синие поля и стоит ли из-за них переживать?

    3) Не говнокод ли это?

    Заранее Спасибо! С Уважением, Сергей!

    • 14.10.2012 Сергей:

      Забыл уточнить, что поля синие только в Хроме и Сафари!

  • 06.11.2012 Гошка:

    Здравствуйте.

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

  • 07.11.2012 Оксана:

    Автору рэспект и уважуха, примитив конечно, но для человека, который из кода знает только то, что он похож на палочки и крючочки — это самое оно. Чего только в инете не найдёшь, а тут всё просто: скопировал, поставил, переделал. — то что мне нужно. С меня + и подписка на обновления.

  • 25.11.2012 Евгений:

    Вот только начал разбираться с jquery! Помогите, пожалуйста, разобраться со следующими строками кода:

    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'));

    Здесь проверяется с помощью условного оператора, истинные ли условия? Или не так?

  • 27.11.2012 Андрей:

    Отлично работает на Firefox, Opera, Chrome, а IE при переключении прозрачных рисунков(png) появляется на секунду чорная обводка старого рисунка, после чего появляется новый рисунок. и так повторяется в цикле. что это может быть?

  • 29.11.2012 Юлия:

    БлагоДарю! Скрипт замечательный, и после небольшой доработки отлично подошел для моего сайта.


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

 css.php