Главная > Tutorials > Плавная смена изображений на JavaScript

Плавная смена изображений на JavaScript

Как то появилась задача сделать плавную смену изображений в web-странице. Решением задачи решил поделиться с вами. Некоторые используют для этого CSS-свойство filter, но понимает его только Internet Explorer, поэтому пришлось искать реализацию, которая работала бы в разных браузерах.


Сначала немного теории.
Используя абсолютное позиционирование, набрасываем в разные слои несколько изображений. И только одно из них должно отображаться сразу, а остальные проявляться со временем.
Чтобы сделать плавную смену одного изображения другим, надо играться со свойствами прозрачности. Любой нормальный браузер понимает CSS3-свойство opacity (принимает значение от 0 до 1), любой но только не Internet Explorer, для него тоже самое приходится делать при помощи filter: alpha(opacity) (принимает значение от 0 до 100).
Мы разобрались с инструментарием для изменения прозрачности, далее надо подумать как сделать смену одного изображения другим. Для этого нам надо через определенный промежуток времени запускать механизм плавного изменения свойств opacity и filter: alpha(opacity) для одного изображения в сторону уменьшения, для другого же в сторону увеличения. Для этого будет использоваться JavaScript-функция setInterval();. Само же плавное изменение уровня прозрачности мы будем делать пошагово пересчитывая значение соответствующих CSS3-свойств, задавая задержку между шагами при помощи JavaScript-функции setTimeout();
Процесс работы скрипта будет выглядеть примерно так:
Имеем три изображения, наложенных одно на другое. Но два из них с минимальным значением прозрачности, и таким образом отображается только одно изображение.
Одновременно изменяя в сторону уменьшения значения прозрачности первого изображения мы увеличиваем значение прозрачности второго.
То же самое повторяем с изображением 2 и 3, потом между 3 и 1, и так далее по кругу.
Вот примерно таким образом должно всё происходить.

Ну и наконец сам листинг скрипта:

<script language=JavaScript>
var total_pics_num = 3;  // колличество изображений
var interval = 4000;     // интервал между изображениями
var time_out = 10;       // задержка кадров

var i = 0;
var timeout;
var opacity = 100;

function fade_to_next()
 {
  opacity–;
  var k = i + 1;
  var image_now = ‘image_’ + i;
  if (i == total_pics_num)
   {
    k = 1;
   }
  var image_next = ‘image_’ + k;
  document.getElementById(image_now).style.opacity = opacity/100;
  document.getElementById(image_now).style.filter = ‘alpha(opacity=’+ opacity +’)';
  document.getElementById(image_next).style.opacity = (100-opacity)/100;
  document.getElementById(image_next).style.filter = ‘alpha(opacity=’+ (100-opacity) +’)';


  timeout = setTimeout(«fade_to_next()»,time_out);
  if (opacity==1)
   {
    opacity = 100;
    clearTimeout(timeout);
   }
 }

setInterval(function () {
   i++;
   if (i > total_pics_num) i=1;
   fade_to_next();
  },interval);

</script>

<img src=’1.jpg’ id=»image_1″ style=»position: absolute;»>
<img src=’2.jpg’ id=»image_2″ style=»opacity: 0; filter: alpha(opacity=0); position: absolute;»>
<img src=’3.jpg’ id=»image_3″ style=»opacity: 0; filter: alpha(opacity=0); position: absolute;»>

Как это работает можно посмотреть тут:
http://tutorials.xyz.net.ua/css_javascript_opacity/

Categories: Tutorials Tags: , ,
  1. Илья
    23 Июль 2010 в 17:18 | #1

    При большем количестве изображений (21, например) лагает ваш скрипт.

  2. Виктор
    11 Март 2010 в 11:07 | #2

    Сделал все как написано, с некоторыми изменениями:

    var total_pics_num = 4; // колличество изображений
    var interval = 3000; // интервал между изображениями
    var time_out = 10; // задержка кадров

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

  3. Амир
    7 Март 2010 в 06:59 | #3

    здрасти всем, скрипт великолепный, но как можно еще добавить такую интересную фишку см. http://www.megalyrics.ru/songs/depeche-mode.htm, там снизу в правой части есть скрипт изменения фотографий такой же как у Вас, но переход между картинками происходит очень интересно, сверху вниз проходят шашечки которые меняют картинку..классная вещь, может можно что то добавить и Ваш скрипт…

  4. AndreyK
    11 Февраль 2010 в 18:13 | #4

    Спасибо большое, работает на всех браузерах и без всяких примудростей и ajaxов… Другие ресурсы предлагают более тяжелый вариант с тем же результатом! Будем посещать еще.

  5. 9 Февраль 2010 в 20:16 | #5

    Спасибо, очень грамотно и понятно! Хочу попробывать на 10 картинках!

  6. 30 Январь 2010 в 16:53 | #6

    @alexxelaf
    Незачто, рад был помочь.

  7. alexxelaf
    30 Январь 2010 в 16:25 | #7

    Спасибо, очень помогли, сэкономил много времени.

  8. 11 Октябрь 2009 в 09:05 | #8

    Идея золотая. Результатами исследований может кто-то похвастаться?

  9. 2 Октябрь 2009 в 07:50 | #9

    @Саша
    Не зачто. Я смотрю, что уже успешно применил!

  10. 16 Сентябрь 2009 в 13:14 | #10

    Спасибо! Попробую применить на своем сайте.

  1. Пока что нет уведомлений.