<div class="pindicator">
  <div class="bullet past">
    <span class="icon">1</span>
    <div class="text">Step 1</div>
  </div>
  <div class="bullet current">
    <span class="icon">2</span>
    <div class="text">Step 2</div>
  </div>
  <div class="bullet next future">
    <span class="icon">3</span>
    <div class="text">Step 3</div>
  </div>
  <div class="bullet future">
    <span class="icon">4</span>
    <div class="text">Step 4</div>
  </div>
  <div class="bullet future">
    <span class="icon">5</span>
    <div class="text">Step 5</div>
  </div>
  <div class="bullet future">
    <span class="icon">6</span>
    <div class="text">Step 6</div>
  </div>
</div>
.pindicator {
  background-color: white;
  display: flex;
  margin: 2rem auto 0;
  width: 30rem;
}
.pindicator .bullet {
  flex: 1;
  position: relative;
  text-align: center;
  transform-style: preserve-3d;
}
.pindicator .bullet::before,
.pindicator .bullet::after {
  content: '';
  display: block;
  position: absolute;
  height: .5rem;
  top: 1.25rem;
  transform: translate3d(0,0,-1px);
}
.pindicator .bullet::before {
  background-color: lightgray;
  width: 100%;
}
.pindicator .bullet::after {
  background-color: black;
  transition: opacity .25s ease-out;
  opacity: 0;
  width: 100%;
}

.pindicator .bullet:first-child::before,
.pindicator .bullet:first-child::after {
  left: 50%;
  width: 50%;
}
.pindicator .bullet:last-child::before,
.pindicator .bullet:last-child::after {
  width: 50%;
}

.pindicator .icon {
  background-color: lightgray;
  border-radius: 100%;
  color: transparent;
  cursor: pointer;
  font-size: 1.5rem;
  display: inline-block;
  height: 2em;
  line-height: 2;
  text-align: center;
  transition: background-color .25s ease-out;
  width: 2em;
}
.pindicator .text {
  color: lightgray;
  font-size: .75rem;
  margin-top: 1rem;
  text-transform: uppercase;
  transition: background-color .25s ease-out;
}
.pindicator .past .icon,
.pindicator .current .icon {
  background-color: black;
  color: white;
}

.pindicator .past::after,  
.pindicator .current::after {
  opacity: 1;
}

.pindicator .past .text,
.pindicator .current .text,
.pindicator .next .text,{
  color: black;
}
View Compiled
console.clear();
(function() {
  "use strict";

  var bulletClasses = {
    elements: {
      container: ".pindicator",
      bullet: ".bullet",
    },
    helpers: {
      past: "past",
      current: "current",
      next: "next",
      future: "future",
    }
  };
  
  var bulletEls;
  document.addEventListener("DOMContentLoaded", initBullets);

  function initBullets() {
    bulletEls = Array.prototype.slice.call(
      document.body.querySelectorAll(bulletClasses.elements.bullet)
    );
    bulletEls.forEach(function(el) {
      el.addEventListener("mousedown", function(event) {
        gotoPage(bulletEls.indexOf(this) + 1);
      });
      el.addEventListener("touchstart", function(event) {
        event.preventDefault();
        gotoPage(bulletEls.indexOf(this) + 1);
      });
    });
  }

  function gotoPage(pageNum) {
    bulletEls.forEach(function(e) {
      e.classList.remove.apply(e.classList,
        Object.keys(bulletClasses.helpers).map(function(e){
          return bulletClasses.helpers[e];
        })
      )
    });
    bulletEls[pageNum - 1].classList.add(bulletClasses.helpers.current);
    if(pageNum > 1) {
      for(var i = 0; i < pageNum; i++) {
        bulletEls[i].classList.add(bulletClasses.helpers.past);
      }
    }
    if(pageNum < bulletEls.length) {
      bulletEls[pageNum].classList.add(bulletClasses.helpers.next);
      for(var i = bulletEls.length - 1; i >= pageNum; i--) {
        bulletEls[i].classList.add(bulletClasses.helpers.future);
      }
    }
  }
})();

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.