<!-- 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();

	});

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js