2014-04-28 5 views
3

Я создал карусель с React.js, это было просто, пока я не добрался до проблемы с анимацией. Карусель классический, он состоит из «слайдов» контента, небольших пуль, обозначающих текущий слайд, и небольших миниатюр для навигации между слайдами.Анимация пользовательской карусели с помощью React.js

Компонент карусели управляется данными, что означает, что он передал его содержимое как массив объектов javascript. Каждый слайд является тегом li в пределах ul, и просто нужно изменить свойство margin-left css ul для перемещения с одного слайда на другой.

Мне интересно, следует ли использовать ReactTransitionGroup или ReactCSSTransitionGroup для анимирования перехода с одного слайда на другой. В основном переход является скользящим эффектом слева направо при переходе с одного слайда на другой.

Я понимаю, что API ReactTransitionGroup s полезен при добавлении или удалении некоторого содержимого. Здесь я не буду добавлять/удалять слайд, меняя видимый на анимацию.

Мое затруднение, обертывающее мою голову вокруг этого, заключается в том, что я разработал старую (ака без анимации) карусель, где текущий отображаемый слайд является единственным состоянием, сохраненным в компоненте. Это состояние является только показателем слайда в массиве слайдов. Поэтому, когда я нажимаю миниатюру, чтобы переместить номер слайда n, единственное, что я делаю, это обновление этого внутреннего состояния, тогда рендеринг позаботится о настройке свойства стиля left на основе этого индекса.

Я не вижу, как я могу добавить анимацию в эту карусель. Любая помощь/подсказка получили высокую оценку.

+1

Вы можете просто использовать переходы CSS3 на полях слева; единственная сложная часть - когда вы в конце и хотите перейти к индексу 0. – FakeRainBrigand

+0

Mmmh ... Часть «end» уже позаботилась о моем коде, поэтому он должен сделать трюк. Благодаря ! – DjebbZ

+0

Не могли бы вы поделиться своим кодом, чтобы другие могли извлечь выгоду из этого. – myusuf

ответ

5

Ответ был довольно простым, не нужно использовать ReactTransitionGroup или ReactCSSTransitionGroup. Я просто использовал встроенный css с переходами css3.

В функции render мы динамически вычисляем свойство left. Поскольку наши слайды имеют одинаковую фиксированную ширину, слайды отображаются встроенными, и только один слайд становится видимым благодаря overflow: hidden на родительском элементе. Наш динамический код класса выглядел так:

var styles = { 
    position: "absolute", 
    top: 0, 
    left: IMG_WIDTH * (this.props.idx - this.props.activeIdx), 
    zIndex: 100, 
    transition: 'left 1s', 
    width: '100%' 
}; 

Не смотрите на формулу слишком много, это деталь реализации.

Обратите внимание: наша карусель «бесконечна», что означает, что переход всегда идет в одну сторону - слева направо - даже когда на первом или последнем элементе. Это был «просто» вопрос игры с индексами массива контента. Эта часть была немного сложнее, чем сама карусель.

Боковое примечание (даже тролль): даже тяжелая часть была лучше, чем выполнение сложной и каббалистической прямой манипуляции с DOM, поскольку это были чистые алгоритмы с данными. Больше нет jQuery для этого материала и даже для остальной части нашего веб-сайта.

+0

Несколько месяцев спустя нам понадобилась более полная карусель, и мы были очень рады перейти на [гладкую карусель] (https://kenwheeler.github.io/slick/). Требуется jQuery, но стоит того. – DjebbZ

+0

Вы просмотрели https://github.com/akiran/react-slick? – HelpMeStackOverflowMyOnlyHope

+0

На момент моего вопроса проект не существовал. Так что нет, я никогда не смотрел на него. После быстрого взгляда он выглядит как обертка React вокруг пятно-карусели. – DjebbZ

Смежные вопросы