JSFiddle - React, Tailwind, and code Playground
by bumbu
HTML
<div class="slider">
<div class="slider-inner">
<div class="element">
<div class="image">
<img class="default" src="http://bumbu.ru/wp-content/uploads/2013/12/scroller_image_default.png" width="99" height="102" alt="">
<img class="active" src="http://bumbu.ru/wp-content/uploads/2013/12/scroller_image_active.png" width="99" height="102" alt="">
</div>
<div class="title"><a href="#">Eco technology for life</a></div>
</div>
<div class="element">
<div class="image">
<img class="default" src="http://bumbu.ru/wp-content/uploads/2013/12/scroller_image_default.png" width="99" height="102" alt="">
<img class="active" src="http://bumbu.ru/wp-content/uploads/2013/12/scroller_image_active.png" width="99" height="102" alt="">
</div>
<div class="title"><a href="#">Eco Power of technology for life</a></div>
</div>
<div class="element">
<div class="image">
<img class="default" src="http://bumbu.ru/wp-content/uploads/2013/12/scroller_image_default.png" width="99" height="102" alt="">
<img class="active" src="http://bumbu.ru/wp-content/uploads/2013/12/scroller_image_active.png" width="99" height="102" alt="">
</div>
<div class="title"><a href="#">Power of new technology for life</a></div>
</div>
<div class="element">
<div class="image">
<img class="default" src="http://bumbu.ru/wp-content/uploads/2013/12/scroller_image_default.png" width="99" height="102" alt="">
<img class="active" src="http://bumbu.ru/wp-content/uploads/2013/12/scroller_image_active.png" width="99" height="102" alt="">
</div>
<div class="title"><a href="#">New technology for life</a></div>
</div>
<div class="element">
<div class="image">
<img class="default" src="http://bumbu.ru/wp-content/uploads/2013/12/scroller_image_default.png" width="99" height="102" alt="">
<img class="active"...
CSS
.slider{
position: relative;
overflow: hidden;
height: 230px;
background-image: linear-gradient(to bottom, #d1dfea, #adc6da);
}
.slider-inner{
height: 230px;
position: absolute;
top: 0;
left: 0;
}
.slider-inner.transition{
transition: 1s cubic-bezier(.6,-0.37,.43,1.36) left;
}
/* Element properties */
.element{
width: 200px;
height: 230px;
float: left;
text-align: center;
transition: 1s cubic-bezier(.6,-0.37,.43,1.36) margin-top;
}
.element .image{
height: 102px;
}
.element .image .active{
display: none;
}
.element .title{
padding: 3px 20px 0;
font-size: 14px;
opacity: 0.5;
transition: 0.2s linear opacity;
text-transform: uppercase;
}
.element .title a{
color: #336791;
}
/* Active element properties */
.element.active .image .default{
display: none;
}
.element.active .image .active{
display: inline-block;
}
.element.active .title{
opacity: 1;
}
/* Slider controls */
.slider-control{
position: absolute;
top: 60px;
display: block;
width: 0;
height: 0;
margin: 0 101px;
border-color: transparent;
border-style: solid;
opacity: 0.7;
}
.slider-control:hover{
opacity: 1;
}
.slider-control.left{
right: 50%;
border-width: 16px 19px 16px 0;
border-right-color: #336791;
}
.slider-control.right{
left: 50%;
border-width: 16px 0 16px 19px;
border-left-color: #336791;
}
JavaScript
$(function(){
$.extend($.easing, {
def: 'easeInSine',
easeInSine: function (x, t, b, c, d) {
return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
},
easeInOutBack: function (x, t, b, c, d, s) {
if (s == undefined) s = 1.70158;
if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
}
});
var $slider = $('.slider')
, slider_width = 0
, $slider_inner = $slider.children().first()
, $elements = $slider_inner.children('.element')
, elements_count = $elements.length
, element_width = $elements.first().width()
, element_margin = 0
, elements_fit = 0
, visible_width = 0
, vertical_max = 30 // max vertical deviation
function onResize() {
slider_width = $slider.width()
elements_fit = Math.floor(slider_width/element_width)
// we have a limited number of elements
if (elements_fit > elements_count) {
elements_fit = elements_count
}
// we need only odd number
if (elements_fit % 2 === 0) {
elements_fit -= 1
}
// find element margin for balancing
element_margin = Math.ceil((slider_width - (element_width * elements_fit))/(elements_fit * 2))
// set container width * 1.5 to fit clonned elements when scroll
visible_width = (element_width + element_margin * 2) * elements_fit
$slider_inner.width(Math.ceil(visible_width * 1.5))
// add margins
$elements.css({'margin-left': element_margin + 'px', 'margin-right': element_margin + 'px'})
// set active element
$elements.removeClass('active')
$elements.slice(Math.floor(elements_fit/2), Math.floor(elements_fit/2) + 1).addClass('active')
}
function goTo(index_to) {
var index_past = Math.floor(elements_fit/2)
// if active element
if (index_to === index_past) {
return
}
var index_diff = index_to - index_past
, $elements_slice
, left_to = 0
...