Я пытаюсь создать слайд-шоу с использованием плагина jQuery Cycle, который содержит еще один уровень вложенных слайд-шоу в некоторых слайдах верхнего уровня.JQuery Cycle -multiple вложенные слайд-шоу и завершение цикла
Основные слайды «контейнер» скользят горизонтально, а затем - для «контейнерных» слайдов, которые содержат более одного изображения с левой стороны - эти изображения скользят вертикально.
образца здесь, потому что я полагаю, что трудно представить себе: http://dl.dropbox.com/u/2890872/js-test/index.html
Вы получите только второй верхнего уровня слайда, прежде чем остановится, даже подумал, есть шесть слайдов верхнего уровня (который мой проблема - второй слайд содержит только одно левое внутреннее изображение, которое останавливает скрипт), но вы можете видеть, что такое запланированные переходы, и проверить весь код.
Проблема заключается в том, что не все вторичные слайд-шоу имеют более одного изображения, а цикл jQuery завершается сам, если в слайд-шоу есть одно или меньше изображений. Это завершение также завершает слайд-шоу верхнего уровня, поскольку оно остановлено и запускается на основе завершения вторичного слайд-шоу. Поскольку вторичное слайд-шоу прекращается из-за только одного «слайда», тогда следующий внешний слайд верхнего уровня никогда не будет вызван. Я не уверен, как адаптировать код, чтобы обойти это.
В ЯШ:
<script type="text/javascript">
$(function(){
// init and stop the inner slideshows
var inners = $('.slide-up').cycle().cycle('stop');
var slideshow = $('#home-slides').cycle({
fx: 'scrollHorz',
speed: 300,
timeout: 0,
before: function() {
// stop all inner slideshows
inners.cycle('stop');
// start the new slide's slideshow
$(this).children().cycle({
fx: 'scrollUp',
timeout: 2000,
autostop: true,
end: function() {
// when inner slideshow ends, advance the outer slideshow
slideshow.cycle('next');
}
});
}
});
});
</script>
Образец HTML:
<div id="home-slides">
<div>
<div class="slide-up">
<img src="i/home/slideshow/1l-1.jpg" alt="" width="284" height="420" />
<img src="i/home/slideshow/1l-2.jpg" alt="" width="284" height="420" />
<img src="i/home/slideshow/1l-3.jpg" alt="" width="284" height="420" />
</div>
<img src="i/home/slideshow/1r.png" alt="" width="291" height="420" />
</div>
<div>
<div>
<img src="i/home/slideshow/2l-1.jpg" alt="" width="284" height="420" />
</div>
<img src="i/home/slideshow/2r.jpg" alt="" width="291" height="420" />
</div>
<div>
<div class="slide-up">
<img src="i/home/slideshow/3l-1.jpg" alt="" width="284" height="420" />
<img src="i/home/slideshow/3l-2.jpg" alt="" width="284" height="420" />
</div>
<img src="i/home/slideshow/3r.png" alt="" width="291" height="420" />
</div>
<div>
…additional slides…
</div>
</div>
Слайд-шоу завершается на второй # домашних слайдов> DIV, потому что есть только один образ. Я попытался удалить вложенность и класс слайдов со слайдов без внутреннего слайд-шоу, но это не помогает.
Опять же, полная рабочая версия всем соответствующим кодом можно найти здесь: http://dl.dropbox.com/u/2890872/js-test/index.html
----------- EDITED 4/10 - Незначительные обновления и, возможно, свинцовый ---- ------
Я отредактировал код здесь и на ссылке примера, чтобы добавить некоторые детали, которые elmininate первые мысли для устранения неполадок. Теперь только слайды со вторичными слайд-шоу используют класс «slide-up».
- Я попытался указать класс «.slide-up» в функции для обратного вызова «end» («$(this).children('.slide-up').cycle
...»), что не позволяет циклу заканчивать слишком мало слайдов, но это только делает его завершающим для непревзойденные элементы!
Ближайший я получил путем добавления условной проверки функции в конце обратного вызова: (Я использую длину, чтобы проверить наличие раздвижного div. Если есть лучший способ, позвольте мне знаю)
before: function() {
if ($(this).children('.slide-up').length != 0) {
// stop all inner slideshows
inners.cycle('stop');
// start the new slide's slideshow
$(this).children('.slide-up').cycle({
fx: 'scrollUp',
timeout: 2000,
autostop: true,
end: function() {
// when inner slideshow ends, advance the outer slideshow
slideshow.cycle('next');
}
});
} else alert('NO INNER SLIDESHOW!');
Это устраняет все ошибки и окончания непосредственно из JQuery цикла, но основной слайд-шоу еще останавливается на слайде без вторичного слайда-шоу. Мне кажется, нужно что-то поместить в «else» заявление, связанное с запуском «slideshow.cycle (« next »)», но я не понял правильный синтаксис, чтобы заставить его работать.
----------- EDIT # 2 4/10 - ----------
последний рабочий пример: http://dl.dropbox.com/u/2890872/js-test/index2.html
Перемещение перед функцией в свою именованную функцию, чтобы держать вещи чище.
function onBefore(currSlideElement, nextSlideElement, options, forwardFlag) {
if ($(this).children('.slide-up').length != 0) {
// stop all inner slideshows
//inners.cycle('stop');
// start the new slide's slideshow
$(this).children('.slide-up').cycle({
fx: 'scrollUp',
timeout: 2000,
autostop: true,
end: function() {
// when inner slideshow ends, advance the outer slideshow
slideshow.cycle('next');
}
});
}
// else null;
else $(this).parent().cycle({
end: function() { slideshow.cycle('next'); }
});
}
Это (другое заявление) позволяет слайд-шоу к прогрессу, но не сохраняет исходные параметры «слайд-шоу», и только начинает играть слайды верхнего уровня с невыполнением из-из-коробки опций (исчезает с одного слайда на другой, вместо того, чтобы скользить, перестает играть вторичные слайды).
Я не понимаю: 1) Как сохранить параметры. (Я подумал, что именно поэтому было создано «слайд-шоу» var »)
2) Почему еще нужно другое утверждение - я не понимаю, почему внешние слайды вообще не останавливаются, когда условно». slide-up "не выполняется - я думаю, что внешнее слайд-шоу будет продолжаться как обычно.
Этот пример действительно опрятный. –
Хотел бы я взять кредит на это, но он очень немного адаптирован на странице примеров здесь: http://jquery.malsup.com/cycle/more.html?v2.23 – Kerri
Я использую цикл, когда только могу, это красивый плагин, который делает все, что мне нужно. –