2016-05-24 4 views
1

Я создаю карусель изображений HTML5 с тремя изображениями. Переходы выполняются с помощью TweenMax и TimeLine. У меня два события щелчка, один для следующего изображения и один для предыдущего изображения, следующая функция изображения работает правильно и представляет собой бесконечный цикл, но предыдущая функция останавливается после того, как она проходит через изображения один раз. вот код.изображение карусель не будет бесконечно петля в обратном

HTML:

<div id="expanded-state"> 
    <div id="expanded-exit"></div> 
    <div id="close-btn"></div> 
    <button id="arrow-prev"></button> 
    <button id="arrow-next"></button> 
    <div id="theater"> 
     <div class="theater"></div> 
     <div class="theater"></div> 
     <div class="theater"></div> 
    </div> 
    <div id="cta"></div> 
    <div id="footer"></div> 
    </div> 
</div> 

CSS:

.theater { 
    width: 970px; 
    height: 345px; 
    position: absolute; 
    top: 0px; 
    left: 0px; 
    z-index: 1; 
} 

.theater:nth-child(1){ 
    background: url(theater-01.jpg); 
} 

.theater:nth-child(2){ 
    background: url(theater-02.jpg); 
} 

.theater:nth-child(3){ 
    background: url(theater-03.jpg); 
} 

JS:

var $slides = $(".theater"); 
var currentSlide = 0; 

function addListeners() { 
    arrowPrev.addEventListener('click', theaterScrollPrev); 
    arrowNext.addEventListener('click', theaterScrollNext); 
} 

function theaterScrollNext() { 

    tm.to($slides.eq(currentSlide), 0.5, {left:"-970px"});   

    if (currentSlide < $slides.length - 1) { 
     currentSlide++; 
    } 
    else { 
     currentSlide = 0; 
    } 

    tm.fromTo($slides.eq(currentSlide), 0.5, {left: "970px"}, {left:"0px"}); 
} 

function theaterScrollPrev() { 

    tm.to($slides.eq(currentSlide), 0.5, {left:"970px"});  

    if (currentSlide < $slides.length - 1) { 
     currentSlide--; 
    } 
    else { 
     currentSlide = 0; 
    } 

    tm.fromTo($slides.eq(currentSlide), 0.5, {left: "-970px"}, {left:"0px"}); 
} 
+0

удлинение моего вопроса немного. jQuery настолько громоздкий, поэтому мне было интересно, есть ли способ ванильного js сделать эту же функцию. Мои js chops еще не очень хороши. Благодарю. –

+0

Вы должны анимировать свойство 'x', а не свойство' left', чтобы вы могли анимировать на субпиксельном уровне. Смещения позиции CSS, такие как 'left', только анимированные на уровне пикселей. Анимация 'x' и' y' будет использовать аппаратное ускорение. Анимирование смещений позиции CSS, таких как 'left', приведет к созданию макета и не даст вам шелковистой гладкой анимации. http://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/ –

ответ

0

Я считаю, что это должно исправить это, но скажите мне, если это не

function theaterScrollPrev() { 
    console.log('previous clicked') 
    tm.to($slides.eq(currentSlide), 0.5, {left:"970px"});  

    if (currentSlide <= 0) { 
     currentSlide = $slides.length -1; 
    } else { 
    currentSlide--; 
    } 

     tm.fromTo($slides.eq(currentSlide), 0.5, {left: "-970px"}, {left:"0px"}); 
} 

Codepen Fixed

+0

благодарит @Riddell, но это не исправить. Первый слайд отображается на загрузке страницы, но когда вы нажимаете предыдущий, он переходит в пустой кадр. –

+0

Не могли бы вы сделать jsFiddle, чтобы я мог попробовать себя, Райан? Это поможет решить проблему. – Riddell

+0

Я использую codepen. http://codepen.io/RECopeland/pen/grVyRY –