Слайдшоу странно работает
Доброй ночи :)
Столкнулся с проблемой при написании простого слайдшоу для сайта. Вот код
(function(el){
var img = ['a1', 'a2', 'a3'], l = img.length, eff = ['fadeIn', 'fadeOut'], k = 1, i = Math.round(Math.random() * (l - 1));
el[1].css('background', 'url(/img/' + img[0] + '.jpg) center bottom no-repeat');
(function(){
el[(m = (i = ++i % l) % 2)].css('background', 'url(/img/' + img[i] + '.jpg) center bottom no-repeat')[eff[k ^= 1]](2000);
el[m ^= 1][eff[k ^= 1]](2000);
setTimeout(arguments.callee, 3000);
})();
})([$("#auto1"), $("#auto2")]);
Фигня в том, что при нечетном количестве элементов в массиве, на последнем элементе получается не плавная смена картинок а "перетык" такой. При четном количестве - все работает как надо. Может конечно поспать надо, но очень хочеться сегодня закончить =) Демо страничка - http://awcentr.ru/new_file.html Заранее спасибо |
может так ?
(function (el) {
var img = ["a1", "a2", "a3"],
l = img.length,
eff = ["fadeIn", "fadeOut"],
i = Math.round(Math.random() * (l - 1)),
m = 0;
el[1].css("background", "url(./img/" + img[i] + ".jpg) center bottom no-repeat");
(function () {
i++;
if (i > l - 1) i = 0;
el[m].css("background", "url(./img/" + img[i] + ".jpg) center bottom no-repeat")[eff[0]](2E3);
m = m == 1 ? 0 : 1;el[m][eff[1]](2E3);setTimeout(arguments.callee, 3E3)
})()
})([$("#auto1"), $("#auto2")]);
|
рони, спасибо, без вас пришлось бы завтра с утра ковыряться...
правда я так и не понял, что изменилось, кроме удаления переменной К и сокращения тысяч :) Ладно, с утра разберусь) Еще раз спасибо итоговый вариант
(function(el){
var img = ["a1", "a2", "a3"], l = img.length, eff = ["fadeIn", "fadeOut"], i = Math.round(Math.random() * (l - 1)), m = 0;
(function(){
el[m].css("backgroundImage", "url(./img/" + img[(i = ++i % l)] + ".jpg)")[eff[0]](2E3);
el[m ^= 1][eff[1]](2E3);
setTimeout(arguments.callee, 3E3)
})()
})([$("#auto1"), $("#auto2")]);
|
ты сам понял, что написал? Не работает, потому что не фиг так выпендриваться с function(){}, выражениями с побочными эффектами и просто писать мозговыносящий код... какие-то оптимизации, которые скорее всего никто не заметит... неужели по-человечески писать нельзя? Например, как-нибудь так:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Untitled Document</title>
<style>
.photo {
position: absolute;
width: 550px;
height: 200px;
top: 40px;
left: 50px;
background-position: center bottom;
background-repeat: no-repeat;
}
</style>
</head>
<body>
<div id="photo" class="photo" style="background-image: url(http://awcentr.ru/img/a1.jpg);"></div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js"></script>
<script type="text/javascript">
var SlideShow = new Class({
initialize: function( el, imgs ){
this._imgs = imgs;
this._firstDiv = $(el);
this._secondDiv = new Element('div', {'class': 'photo'})
.inject(el, 'after');
this._i = 0;
},
start: function(){
this.next.of(this).runPeriodically( 3000 );
},
next: function(){
this._firstDiv.fade('out');
var src = 'http://awcentr.ru/img/'+this._imgs[this._i];
this._secondDiv.setStyle('background-image', 'url('+src+')');
this._secondDiv.fade('in');
this._swapDivs();
this._i = (this._i+1) % this._imgs.length;
},
_swapDivs: function(){
var t = this._firstDiv;
this._firstDiv = this._secondDiv;
this._secondDiv = t;
}
});
Function.implement({
of: function( o ){
var f = this;
return function(){
return f.apply( o, arguments );
};
},
runPeriodically: function( interval ){
var f = this;
setTimeout( function(){
f();
setTimeout( arguments.callee, interval );
}, interval );
}
});
</script>
<script type="text/javascript">
new SlideShow( 'photo', [
'a1.jpg', 'a2.jpg', 'a3.jpg'
]).start();
</script>
</body>
</html>
|
x-yuri,
Конечно понял, я же писал :) А что такое выражения с побочными эффектами? Не в выпендреже дело, просто пишу так и все. По крайней мере, когда знаю, что этот код кроме меня трогать не будет. По оптимизации. Мой код, как минимум, в 5 раз короче получился. |
Цитата:
Цитата:
el[m ^= 1][eff[k ^= 1]](2000); без побочных эффектов будет выглядеть так m ^= 1; k ^= 1; el[m][eff[k]](2000); Цитата:
Цитата:
|
x-yuri,
Шутка хорошая :) Про код. Все зависит от задач. Для реально простых вещей, для меня такой стиль кода предпочтительнее. В своем фреймворке - пишу по-другому. По поводу того, что я в нем запутался, ну блин, бывает, долго не спал, устал, да еще до сих пор бессонница долбит. В прочем ладно, уже офтоп пошел :) |
| Часовой пояс GMT +3, время: 22:11. |