Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Си-решеточник
 Аватар для Rameron
141 / 135 / 60
Регистрация: 07.02.2011
Сообщений: 669

Дерганное слайдшоу

03.10.2012, 01:11. Показов 1690. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется несколько картинок, которые на странице проигрываются как слайдшоу. Переход от одной картинки к следующей происходит плавно, с убыванием прозрачности одной и прибавления его же в другой. НО.
Когда происходит переход к следующей картинке, содержимое контейнера img2 переходит в img1, а в img2 грузится следующая картинка. И вот когда она загрузилась, она на миг отображается и только потом её опасити меняется на 0.

Да и скорость неравномерная почему-то...

Такие вот проблемы.

Вот код:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<HTML>
<HEAD>
<TITLE>SlideShow</TITLE>
</HEAD>
<BODY>
 
<img src="" id = "imgRotatorF" width="1280" height="347" style="opacity:1;position:absolute;top:0;">
<img src="" id = "imgRotatorS" width="1280" height="347" style="opacity:0;position:absolute;top:0;">
<!--position:absolute;top:0;-->
 
<SCRIPT type="text/javascript">
    strImgs = new Array ( 
    "0.png",
    "1.png",
    "2.png",
    "3.png", 
    "4.png",
    "5.png",
    "6.png",
    "7.png",
    "8.png",
    "9.png"
    );                                              //Массив с картинками, разделяются запятыми
    
    var strImageID1 = "imgRotatorF";                //ID первой картинки для смены
    var strImageID2 = "imgRotatorS";                //ID второй картинки для смены
    
    var startDelay = 3000;                          //Начальная задержка
    var showTime = 4000;                            //Время отображения одной картинки
    var changeTime = 10;                            //Скорость смены прозрачности
    var opacityStep = 0.01;                         //Шаг изменения прозрачности (косвенно связан с предыдущим)
    
    
    var nCur = 0;
    var curOp = 1;
    var nextOp = 0;
    var img1 = document.getElementById(strImageID1);
    var img2 = document.getElementById(strImageID2);
 
    var imgArray = new Array(strImgs.length);
    
    preloadImages();
    init();
 
function init()
{
    img1.src = imgArray[nCur];  
    img2.src = imgArray[nCur + 1];
    
    setTimeout("slideShow()",startDelay);
}   
 
function preloadImages()
{
    var i;
    for (i = 0; i < strImgs.length; i++)
    {
        imgArray[i] = new Image();
        imgArray[i] = strImgs[i];
    }
}
    
    
function slideShow()
{   
    img1.src = imgArray[nCur];
    img2.src = imgArray[(nCur + 1==strImgs.length?0:nCur + 1)];
 
    setElementOpacity(strImageID1, 1);
    setElementOpacity(strImageID2, 0);
    
    setSmoothOpacity(strImageID1, strImageID2);
    curOp = 1;
    nextOp = 0;
        
    nCur++;
    if (nCur == strImgs.length) nCur = 0;
 
    setTimeout("slideShow()",showTime + changeTime*opacityStep*100);
}   
 
function setSmoothOpacity(sFirImageID, sSecImageID)
{
    setElementOpacity(sFirImageID, curOp);
    curOp -= opacityStep;
 
    setElementOpacity(sSecImageID, nextOp);
    nextOp += opacityStep;
    
    if (curOp == 0) return;
    
    setTimeout("setSmoothOpacity("+ '\"' + sFirImageID + '\"' + ", " + '\"' + sSecImageID  + '\"' + ")",changeTime);
    
}
function setElementOpacity(sElemId, nOpacity)
{
  var opacityProp = getOpacityProperty();
  var elem = document.getElementById(sElemId);
 
  if (!elem || !opacityProp) return; // Если не существует элемент с указанным id или браузер не поддерживает ни один из известных функции способов управления прозрачностью
  
  if (opacityProp=="filter")  // Internet Exploder 5.5+
  {
    nOpacity *= 100;
    
    // Если уже установлена прозрачность, то меняем её через коллекцию filters, иначе добавляем прозрачность через style.filter
    var oAlpha = elem.filters['DXImageTransform.Microsoft.alpha'] || elem.filters.alpha;
    if (oAlpha) oAlpha.opacity = nOpacity;
    else elem.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+nOpacity+")"; // Для того чтобы не затереть другие фильтры используем "+="
  }
  else // Другие браузеры
    elem.style[opacityProp] = nOpacity;
}
function getOpacityProperty()
{
  if (typeof document.body.style.opacity == 'string') // CSS3 compliant (Moz 1.7+, Safari 1.2+, Opera 9)
    return 'opacity';
  else if (typeof document.body.style.MozOpacity == 'string') // Mozilla 1.6 и младше, Firefox 0.8 
    return 'MozOpacity';
  else if (typeof document.body.style.KhtmlOpacity == 'string') // Konqueror 3.1, Safari 1.1
    return 'KhtmlOpacity';
  else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5) // Internet Exploder 5.5+
    return 'filter';
 
  return false; //нет прозрачности
}
</SCRIPT>
</BODY>
</HTML>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.10.2012, 01:11
Ответы с готовыми решениями:

Слайдшоу
Здравствуйте, подскажите как можно сделать подобное слайдшоу http://thewaltdisneycompany.com/ чтобы через 10-15 секунд, листалось по три...

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

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

4
Заблокирован
03.10.2012, 07:40
а подревнее скрипта найти не смогли?

Internet Explodrer 5.5+, который здесь проверяется, выпущен в прошлом веке, в июле 2000 года - 12 лет назад
полагаю, на планете осталось не более десяти-пятнадцати человек, у которых этот браузер "по приколу" стоит на компьютере
-----

тайм-ауты "убивать" надо, а они здесь "плодятся" в неимоверном количестве и не "убиваются"
отсюда и неравномерность скорости, и дёрганья всякие
кроме того, картинки не "предзагружены" в кеш браузера, при первом "проходе" дёрганья неизбежны
-----

в общем, держите код, всего из одной функции, но ещё и с "предзагрузкой"
тега <img> вполне достаточно одного, да и абсолютно позиционировать ничего не нужно
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<script>
function mFunc ()
{
var showTime = 4000, opTime = 30, obj = document.getElementById ('mPic'), w = obj.lang,
pics = ['http://img11.nnm.ru/7/2/8/c/f/078c81643af689f711a11f8b780.jpg',
        'http://uvarvar.narod.ru/img_7060.jpg',
        'http://super-naruto.3dn.ru/_fr/3/1580767.jpg',
        'http://img197.imageshack.us/img197/2352/bosque05.jpg',
        'http://desktop.alloflyrics.com/i/nature/70.jpg',
        'http://files.myopera.com/trash89/albums/300557/friends_1280_1024.jpg'];
// в массиве pics могут быть как абсолютные, так и относительные адреса картинок
if (!self.TMR) for (var j = 0, m = [], lj = pics.length; j < lj; j++)
m [j] = new Image (), m [j].src = pics [j]; else clearTimeout (TMR); if (w == 0)
   {
   for (var j = 0, lj = pics.length; j < lj; j++) 
   if (obj.src.indexOf (pics [j]) != -1) break;
   if (++j >= lj) j = 0; obj.src = pics [j], obj.lang = 1; return;
   }
if (w == 100) {obj.lang *= -1, TMR = setTimeout (mFunc, showTime); return}
var k = w > 0 ? 1 : -1, b = ('v' == '\v');
obj.style [b ? 'filter' : 'opacity'] = b ? 'alpha(opacity=' + k * ++obj.lang + ')'
: ++obj.lang * k * .01; TMR = setTimeout (mFunc, opTime);
}
</script>
 
<img id="mPic" src="http://uvarvar.narod.ru/img_7060.jpg" onload="mFunc ()" lang="-100">
<!-- в SRC тега может быть адрес, как имеющийся в массиве pics, так и не имеющийся -->
разумеется, габариты тега <img> указывать тоже надо - в теге, или через блок стилей
у меня (для картинок, взятых из Яндекса) это - style="width: 800px; height: 600px"
0
Си-решеточник
 Аватар для Rameron
141 / 135 / 60
Регистрация: 07.02.2011
Сообщений: 669
03.10.2012, 11:42  [ТС]
О боже... Не могли бы объяснить, где в вашем в коде предзагрузка и почему моя функция preloadImages() в начале не выполняет эту функцию? =)

И нужно ли выполнять clearTimeout() для таймера в slideShow(), так как он постоянно активен. Или setTimeout() создает каждый раз новый таймер?

Кроме того, в случае вашего скрипта действительно не нужны несколько <img>, у меня же идет "смешивание картинок" то есть одновременно меняется прозрачность обоих картинок, одной в плюс, другой в минус, и они "перетекают" друг в друга. Одним <img>, как я понимаю, тут не обойтись.

Добавлено через 12 минут
А для чего параметр lang?
0
Заблокирован
03.10.2012, 19:02
Цитата Сообщение от Rameron Посмотреть сообщение
Не могли бы объяснить, где в вашем в коде предзагрузка и почему моя функция preloadImages() в начале не выполняет эту функцию?
объясняю:
-- в моём коде предзагрузка выполняется в строках ##12 и 13 моего кода:
for (var j = 0, m = [], lj = pics.length; j < lj; j++) m [j] = new Image (), m [j].src = pics [j]; и исполняется сразу после загрузки стартовой картинки в тег <img>, когда ещё не включён самый первый таймер if (!self.TMR)

-- ваша функция preloadImages () вызывается вами в глобальном контексте в строке #42 вашего кода и вызывается она ещё ДО её определения (которое находится в строках ##53-61 вашего кода)

в момент исполнения строки #42 ваша функция preloadImages () является is not defined
иными словами, вы зовёте покурить и выпить пива Васю Пупкина, который ещё не родился
Цитата Сообщение от Rameron Посмотреть сообщение
Или setTimeout() создает каждый раз новый таймер?
а вы думаете как-то иначе?
да, всякий раз создаётся новый таймер со своим уникальным идентификатором
с учётом вашего значения var changeTime = 10; - сто штук в секунду, шесть тысяч штук в минуту... и это не считая ваших стартового и "показушного" таймеров
и все они "живут" вплоть до закрытия страницы
Цитата Сообщение от Rameron Посмотреть сообщение
у меня же идет "смешивание картинок" то есть одновременно меняется прозрачность обоих картинок, одной в плюс, другой в минус, и они "перетекают" друг в друга
"перетекание" одной картинки в другую за период 1 секунда - это не "перетекание"... это "какафония цвета" какая-то
Цитата Сообщение от Rameron Посмотреть сообщение
А для чего параметр lang?
не "параметр", а "атрибут/свойство"
атрибут/свойство тега <IMG>
и не только этого тега - поддерживается практически всеми тегами, см. http://www.w3.org/TR/1999/REC-... #adef-lang

главная отличительная особенность этого атрибута/свойства заключается в том, что он никогда и никем по своему прямому назначению не используется
что ж добру без дела пропадать?
вот и использую я этот атрибут/свойство в качестве места для хранения как текущего значения прозрачности, так и "направления изменения" (знак минус показывает, что значение прозрачности надо уменьшать; знак плюс показывает, что значение прозрачности надо увеличивать; достижение значения == 100 показывает, что надо изменять знак; достижение значения == 0 показывает, что надо грузить следующую картинку)

вы в своём коде для этого используете аж три глобальных переменных nCur, curOp, nextOp
мой способ, как мне кажется, минимум в три раза эффективнее вашего
1
Си-решеточник
 Аватар для Rameron
141 / 135 / 60
Регистрация: 07.02.2011
Сообщений: 669
03.10.2012, 21:53  [ТС]
Эмм... то есть порядок при написания функций и её вызова имеет значение? Пишу на Java и С#, там такого бреда нету, даже подумать не мог, что в JS такое еще осталось (как вы, наверное, поняли, я только начал изучать JS)

Цитата Сообщение от Notortep Посмотреть сообщение
..."перетекание" одной картинки в другую за период 1 секунда - это не "перетекание"... это "какафония цвета" какая-то ...
Заказчик этого требует, что я могу поделать

Так стоп... В 69 и 70 строках своего кода я вызываю функцию, которая объявлена только в 95 строке. И всё вызывается и работает, то есть уже is not defined исключен. Я чего-то недопонимаю...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.10.2012, 21:53
Помогаю со студенческими работами здесь

Слайдшоу для некоторых слов
есть список слов типа как реализовать вывод их на страницы интервала между словам (секунды); длительность показа одного слова...

Слайдшоу для картинок из папки
Итак,для главной страницы своего сайта мне хотелось бы сделать какую-нибудь примочку,связанную с картинками,скажем,чтобы картинки из папки...

Каждый элемент dropdownlist показывает разное слайдшоу
Как создать dropdownlist, где каждый вариант из списка, показывает слайдшоу картинок. Массив картинок для каждого варианта отличается. Я...

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

Как сменить сменить картинку в слайдшоу?
// Slideshow for the Microsoft Desktop Sidebar // Copyright 2005, 2006 Microsoft Corporation // All Rights Reserved //...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru