<div class="container">
  <div class="row">
    <div class="col-xs-12">
      
      <div class="h5">Basic</div>
      <div class="multi-step">
        <ul class="multi-step-list">
          <li class="multi-step-item current">
            <div class="item-wrap">
              <p class="item-title">Step One</p>
            </div>
          </li>
          <li class="multi-step-item">
            <div class="item-wrap">
              <p class="item-title">Step Two</p>
            </div>
          </li>
          <li class="multi-step-item">
            <div class="item-wrap">
              <p class="item-title">Step Three</p>
            </div>
          </li>
          <li class="multi-step-item">
            <div class="item-wrap">
              <p class="item-title">Step Four</p>
            </div>
          </li>
        </ul>
      </div>
      
      <div class="h5">Clickable</div>
      <div class="multi-step">
        <ul class="multi-step-list">
          <li class="multi-step-item active current">
            <div class="item-wrap">
              <p class="item-title">Step One</p>
            </div>
          </li>
          <li class="multi-step-item active">
            <div class="item-wrap">
              <p class="item-title">Step Two</p>
            </div>
          </li>
          <li class="multi-step-item active">
            <div class="item-wrap">
              <p class="item-title">Step Three</p>
            </div>
          </li>
          <li class="multi-step-item active">
            <div class="item-wrap">
              <p class="item-title">Step Four</p>
            </div>
          </li>
        </ul>
      </div>
      
      <div class="h5">Numbered - <code>.numbered</code></div>
      <div class="multi-step numbered">
        <ul class="multi-step-list">
          <li class="multi-step-item active current">
            <div class="item-wrap">
              <p class="item-title">Step One</p>
            </div>
          </li>
          <li class="multi-step-item active">
            <div class="item-wrap">
              <p class="item-title">Step Two</p>
            </div>
          </li>
          <li class="multi-step-item active">
            <div class="item-wrap">
              <p class="item-title">Step Three</p>
            </div>
          </li>
          <li class="multi-step-item active">
            <div class="item-wrap">
              <p class="item-title">Step Four</p>
            </div>
          </li>
        </ul>
      </div>
      
      <div class="h5">Checked - <code>.checked</code></div>
      <div class="multi-step checked">
        <ul class="multi-step-list">
          <li class="multi-step-item active completed">
            <div class="item-wrap">
              <p class="item-title">Step One</p>
            </div>
          </li>
          <li class="multi-step-item active completed">
            <div class="item-wrap">
              <p class="item-title">Step Two</p>
            </div>
          </li>
          <li class="multi-step-item active completed">
            <div class="item-wrap">
              <p class="item-title">Step Three</p>
            </div>
          </li>
          <li class="multi-step-item active current">
            <div class="item-wrap">
              <p class="item-title">Step Four</p>
            </div>
          </li>
        </ul>
      </div>
      
      <div class="h5">Validation</div>
      <div class="multi-step">
        <ul class="multi-step-list">
          <li class="multi-step-item active current">
            <div class="item-wrap">
              <p class="item-title">Step One</p>
            </div>
          </li>
          <li class="multi-step-item active error">
            <div class="item-wrap">
              <p class="item-title">Step Two</p>
            </div>
          </li>
          <li class="multi-step-item active error">
            <div class="item-wrap">
              <p class="item-title">Step Three</p>
            </div>
          </li>
          <li class="multi-step-item active error">
            <div class="item-wrap">
              <p class="item-title">Step Four</p>
            </div>
          </li>
        </ul>
      </div>
      
      <div class="h5">Subtitle</div>
      <div class="multi-step">
        <ul class="multi-step-list">
          <li class="multi-step-item active current">
            <div class="item-wrap">
              <p class="item-title">Step One</p>
              <p class="item-subtitle">Information about this step.</p>
            </div>
          </li>
          <li class="multi-step-item active">
            <div class="item-wrap">
              <p class="item-title">Step Two</p>
              <p class="item-subtitle">Information about this step.</p>
            </div>
          </li>
          <li class="multi-step-item active">
            <div class="item-wrap">
              <p class="item-title">Step Three</p>
              <p class="item-subtitle">Information about this step.</p>
            </div>
          </li>
        </ul>
      </div>
      
      <div class="h5">Badges</div>
      <div class="multi-step">
        <ul class="multi-step-list">
          <li class="multi-step-item active current">
            <div class="item-wrap">
              <p class="item-title">Step One</p>
              <p class="badge">10</p>
            </div>
          </li>
          <li class="multi-step-item active">
            <div class="item-wrap">
              <p class="item-title">Step Two</p>
            </div>
          </li>
          <li class="multi-step-item active error">
            <div class="item-wrap">
              <p class="item-title">Step Three</p>
              <p class="badge">2</p>
            </div>
          </li>
          <li class="multi-step-item active error">
            <div class="item-wrap">
              <p class="item-title">Step Four</p>
            </div>
          </li>
        </ul>
      </div>
      
      <div class="h5">Loading Step</div>
      <div class="multi-step">
        <ul class="multi-step-list">
          <li class="multi-step-item active current multi-step-loading">
            <div class="item-wrap">
              <div class="busy-css"></div>
              <p class="item-title">Step One</p>
            </div>
          </li>
          <li class="multi-step-item active multi-step-loading">
            <div class="item-wrap">
              <div class="busy-css"></div>
              <p class="item-title">Step Two</p>
            </div>
          </li>
          <li class="multi-step-item active error multi-step-loading">
            <div class="item-wrap">
              <div class="busy-css"></div>
              <p class="item-title">Step Three</p>
            </div>
          </li>
          <li class="multi-step-item active error multi-step-loading">
            <div class="item-wrap">
              <div class="busy-css"></div>
              <p class="item-title">Step Four</p>
            </div>
          </li>
        </ul>
      </div>
      
    </div>
  </div>
</div>
// Variables
$base-margin: 2em;
$base-padding: 1em;
$base-border-radius: .2em;
$screen-xs-max: 786px;

$text-color: #263238;
$text-color-inverted: #fff;
$clickable-hover: #d8f1ff;

$brand-primary: #3e5fd6;
$brand-success: #26a25f;
$brand-danger: #f82502;

$accent-dark: #253c8e;
$accent-light: #3855bd;
$accent-lighter: #ffffff;

$icon-danger: '!';
$icon-success: '✓';

$animation-time: 0.5s;

html, body {
  background-color: #efefef;
}


// Multi-step code

.multi-step {
  margin: ($base-margin / 2) 0;
}

// Setting up flexbox for list
.multi-step-list {
  position: relative;
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  list-style-type: none;
  padding: 0;
  .multi-step-item:first-child { margin-left: 0; }
  .multi-step-item:last-child { margin-right: 0; }
}

// Defaults for each 'step'
.multi-step-item {
  position: relative;
  width: 100%;
  margin: 0 ($base-margin / 6);
  @media only screen and (max-width: $screen-xs-max) {
    margin: 0 ($base-margin / 6);
  }
  z-index: 2;
  border-radius: $base-border-radius;

  // Step title and subtitle defaults
  .item-title,
  .item-subtitle {
    position: relative;
    margin: 0;
    z-index: 2;
  }
  @media only screen and (max-width: $screen-xs-max) {
    .item-subtitle { display: none; }
  }
  .item-title {
    color: $brand-primary;
    font-weight: 600;
    margin: 0;
  }

  // Different step states [ active, current, completed, error]
  &.active:hover { cursor: pointer; }
  &.current .item-title,
  &.current .item-subtitle {
    color: $text-color-inverted;
  }
  &.active.current:hover .item-title,
  &.active.current:hover .item-subtitle {
    color: $brand-primary;
  }
  &.error:after {
    position: absolute;
    top: 50%;
    z-index: 2;
    transform: translateY(-50%);
    right: .5em;

    content: $icon-danger;
    color: $brand-danger;
  }
}

// Creates the 'arrow' effect / background colors
.item-wrap {
  padding: $base-padding;
  position: relative;
  height: 100%;
  &:before, &:after {
    position: absolute;
    left: 0;
    content: ' ';
    width: 100%;
    height: 50.5%;
    z-index: 1;
    background-color: $accent-lighter;
  }

  // Top of the arrow
  &:before {
    top: 0;
    transform: skew(20deg);
    border-radius: .2em .2em 0 0;
  }
  // Bottom of the arrow
  &:after {
    bottom: 0;
    transform: skew(-20deg);
    border-radius: 0 0 .2em .2em;
  }
}

// Changing arrow colors based on state
.current .item-wrap:before,
.current .item-wrap:after {
  background-color: $brand-primary;
}

.active:hover .item-wrap:before,
.active:hover .item-wrap:after {
  background-color: $clickable-hover;
}

.multi-step-item.error {
  .item-title,
  .item-subtitle {
    padding-right: ($base-padding * 2);
  }
}

// Changing step styles based on :first/:last step
.multi-step-item:first-child .item-wrap,
.multi-step-item:last-child .item-wrap {
  width: 100%;
  border-radius: $base-border-radius;
  &:before, &:after { width: 50%; }
}

// If first step, only point on the right
.multi-step-item:first-child .item-wrap {
  background: linear-gradient(to right, $accent-lighter 95%, transparent 5%);
  &:before, &:after { left: 50%; }
}
.active.multi-step-item:first-child:hover .item-wrap {
  background: linear-gradient(to right, $clickable-hover 95%, transparent 5%);
}
.current.multi-step-item:first-child .item-wrap {
  background: linear-gradient(to right, $brand-primary 95%, transparent 5%);
}

// If last step, only indent on the left
.multi-step-item:last-child .item-wrap {
  background: linear-gradient(to left, $accent-lighter 95%, transparent 5%);
  &:before, &:after { right: 50%; }
}
.active.multi-step-item:last-child:hover .item-wrap {
  background: linear-gradient(to left, $clickable-hover 95%, transparent 5%);
}
.current.multi-step-item:last-child .item-wrap {
  background: linear-gradient(to left, $brand-primary 95%, transparent 5%);
}

// MSI Checked & Complete
.checked .multi-step-item.completed:after {
  position: absolute;
  top: 50%;
  z-index: 2;
  transform: translateY(-50%);
  right: .5em;
  content: $icon-success;
  color: $brand-success;
}

// MSI Numbered
.numbered .multi-step-item {
  counter-increment: step-counter;
  .item-wrap { padding-left: ($base-padding * 5); }

  // Adds number to step
  &:before {
    content: counter(step-counter);
    position: absolute;
    top: 50%;
    left: .75em;
    transform: translateY(-50%);
    min-width: 1.65em;
    padding: ($base-padding / 2) $base-padding;
    z-index: 2;
    font-size: .85em;
    background-color: $accent-light;
    color: $text-color-inverted;
    font-weight: 600;
    text-align: center;
    border-radius: $base-border-radius;
  }
}

// MSI w/ badge counts
.item-wrap .badge {
  position: absolute;
  right: .5em;
  top: 50%;
  transform: translateY(-50%);
  z-index: 3;
}
.error .item-wrap .badge {
  right: 2em;
  ~ .item-title,
  ~ .item-subtitle {
    padding-right: 3em;
  }
}

// MSI CSS Loader
.multi-step-loading { opacity: .75; }

.current.multi-step-loading:before {
  border-color: $text-color-inverted;
  border-top-color: transparent;
  opacity: 1;
}

.busy-css {
  z-index: 3;
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  margin-top: -.5em;
  margin-left: -.5em;
  border-radius: 50%;
  width: 1em;
  height: 1em;
  border: .25em solid $accent-dark;
  border-top-color: transparent;
  animation: spin ($animation-time * 2) infinite linear;
}

@keyframes spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}
View Compiled

External CSS

  1. https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css

External JavaScript

This Pen doesn't use any external JavaScript resources.