UNPKG

react-slick

Version:
131 lines (111 loc) 3.63 kB
'use strict'; import React from 'react'; import assign from 'object-assign'; import classnames from 'classnames'; var getSlideClasses = (spec) => { var slickActive, slickCenter, slickCloned; var centerOffset, index; if (spec.rtl) { index = spec.slideCount - 1 - spec.index; console.log(); } else { index = spec.index; } slickCloned = (index < 0) || (index >= spec.slideCount); if (spec.centerMode) { centerOffset = Math.floor(spec.slidesToShow / 2); slickCenter = (spec.currentSlide === index); if ((index > spec.currentSlide - centerOffset - 1) && (index <= spec.currentSlide + centerOffset)) { slickActive = true; } } else { slickActive = (spec.currentSlide <= index) && (index < spec.currentSlide + spec.slidesToShow); } return classnames({ 'slick-slide': true, 'slick-active': slickActive, 'slick-center': slickCenter, 'slick-cloned': slickCloned }); }; var getSlideStyle = function (spec) { var style = {}; if (spec.variableWidth === undefined || spec.variableWidth === false) { style.width = spec.slideWidth; } if (spec.fade) { style.position = 'relative'; style.left = -spec.index * spec.slideWidth; style.opacity = (spec.currentSlide === spec.index) ? 1 : 0; style.transition = 'opacity ' + spec.speed + 'ms ' + spec.cssEase; style.WebkitTransition = 'opacity ' + spec.speed + 'ms ' + spec.cssEase; } return style; }; var renderSlides = (spec) => { var key; var slides = []; var preCloneSlides = []; var postCloneSlides = []; var count = React.Children.count(spec.children); var child; React.Children.forEach(spec.children, (elem, index) => { if (!spec.lazyLoad | (spec.lazyLoad && spec.lazyLoadedList.indexOf(index) >= 0)) { child = elem; } else { child = (<div></div>); } var childStyle = getSlideStyle(assign({}, spec, {index: index})); var slickClasses = getSlideClasses(assign({index: index}, spec)); var cssClasses; if (child.props.className) { cssClasses = classnames(slickClasses, child.props.className); } else { cssClasses = slickClasses; } slides.push(React.cloneElement(child, { key: index, 'data-index': index, className: cssClasses, style: Object.assign({}, child.props.style || {}, childStyle) })); // variableWidth doesn't wrap properly. if (spec.infinite && spec.fade === false) { var infiniteCount = spec.variableWidth ? spec.slidesToShow + 1 : spec.slidesToShow; if (index >= (count - infiniteCount)) { key = -(count - index); preCloneSlides.push(React.cloneElement(child, { key: key, 'data-index': key, className: getSlideClasses(assign({index: key}, spec)), style: Object.assign({}, child.props.style || {}, childStyle) })); } if (index < infiniteCount) { key = count + index; postCloneSlides.push(React.cloneElement(child, { key: key, 'data-index': key, className: getSlideClasses(assign({index: key}, spec)), style: Object.assign({}, child.props.style || {}, childStyle) })); } } }); if (spec.rtl) { return preCloneSlides.concat(slides, postCloneSlides).reverse(); } else { return preCloneSlides.concat(slides, postCloneSlides); } }; export var Track = React.createClass({ render: function () { var slides = renderSlides(this.props); return ( <div className='slick-track' style={this.props.trackStyle}> { slides } </div> ); } });