<!-- Slider Element -->
<section class="wrapper__slider">
<!-- Slider Content -->
<div class="slider" id="slider">
<div class="slider__holder">
<figure class="slider__slide" id="slide-0">
<figcaption>first slide</figcaption>
</figure>
<figure class="slider__slide" id="slide-1">
<figcaption>second slide</figcaption>
</figure>
<figure class="slider__slide" id="slide-2">
<figcaption>third slide</figcaption>
</figure>
</div>
</div>
<!-- END Slider Content -->
<!-- Slider Navigation -->
<nav class="slider__nav">
<a class="slider__anchor slider__anchor--active" href="#slide-0">1</a>
<a class="slider__anchor" href="#slide-1">2</a>
<a class="slider__anchor" href="#slide-2">3</a>
</nav>
<!-- END Slider Navigation -->
</section>
<!-- END Slider Element -->
@import url('https://fonts.googleapis.com/css?family=Exo:100');
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background: linear-gradient(#111, #1a1a1a);
}
.wrapper__slider {
margin: 20px auto;
width: 420px;
}
/* SLIDER */
.slider {
height: calc(420px * (16/9));
background-color: black;
overflow: hidden;
}
.slider__holder {
height: 100%;
width: 300%;
display: flex;
flex-direction: row;
}
.slider__slide {
width: calc(100% / 3);
flex: 1;
height: 100%;
position: relative;
background-position: center;
background-size: auto 100%;
}
.slider__slide:before {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 40%;
background: linear-gradient(transparent, #000);
}
#slide-0, #slide-1, #slide-2 {
background-image: url(https://unsplash.it/1920/1080?image=961);
}
/* NAV */
.slider__nav {
display: flex;
justify-content: center;
}
.slider__anchor {
height: 4px;
width: 56px;
position: relative;
text-indent: -9999px;
margin: 6px;
padding: 12px 0;
}
.slider__anchor:before {
content: '';
position: absolute;
height: 4px;
width: 56px;
background-color: dimgrey;
transition: background .2s ease;
top: 10px;
left: 0;
}
.slider__anchor:hover:before {
background-color: lightgrey;
}
.slider__anchor--active:before {
background-color: darkgrey;
}
/* TEXT */
.slider__slide figcaption {
position: absolute;
bottom: 0;
color: white;
width: 100%;
font-size: 48px;
font-family: 'Exo', sans-serif;
text-transform: uppercase;
font-weight: 100;
text-align: center;
padding: 32px;
}
var Slider = {
// Get elements
DOM: {
slider: $('#slider'),
sliderSlides: $('.slider__slide'),
sliderNav: $('.slider__nav'),
sliderNavElements: $('.slider__anchor')
},
initSlider: function() {
this.setupSlider();
this.bindEventHandler();
},
// Slider setup
setupSlider: function() {
// Get slide width
this.slideWidth = this.DOM.slider.width();
// Magic numbers for defining initial offset
var offset = this.slideWidth/6;
// Array for individual offset values
var offsetCalc = [];
// Offset each slides background based on its index
$.each(this.DOM.sliderSlides, function(i) {
// Calculated offset for individual element
offsetCalc[i] = i * offset;
});
// Save array to object property
this.offset = offsetCalc;
},
// Event binding
bindEventHandler: function() {
// Handle scroll event on slider
this.DOM.slider.on('scroll', function(event) {
Slider.moveSlides(event);
});
// Handle click event on nav elements
this.DOM.sliderNav.on('click', '.slider__anchor', function(event) {
Slider.handleClick(event, this);
});
},
moveSlides: function(event) {
// Scroll Position
var position = $(event.target).scrollLeft()/6;
// Set offset for each individual slide
$.each(this.DOM.sliderSlides, function(i) {
// Calculate X position of background
var offsetX = Slider.offset[i] - position;
// Offset each slide from center based on its index
$(this).css({
'background-position': 'calc(50% + ' + offsetX + 'px) 0'
});
});
},
handleClick: function(event, element) {
// Don't change URL
event.preventDefault();
// Get number from id
var position = $(element).attr('href').split('-').pop();
this.DOM.slider.stop().animate({ // Stop running animations to prevent queue
scrollLeft: position * this.slideWidth
}, 800);
this.setActive(element);
},
setActive: function(element) {
this.DOM.sliderNavElements.removeClass('slider__anchor--active');
$(element).addClass('slider__anchor--active');
}
}
// Don't execute until CSS is applied
$(window).on('load', function() {
Slider.initSlider();
});
This Pen doesn't use any external CSS resources.