<div id="container">
  <p id="count">1</p>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
  <div class="dot"></div>
</div>
 <p class="message">Requires a browser that supports CSS Motion Path (such as Chrome 43+ with Experimental Web Platform Features enabled in chrome://flags)</p>
$back: #863334;
$primary: #f5f5fb;
$duration: 4000ms;

body {
  background: $back;
  font-family: "Helvetica Neue", Arial, sans-serif;
}
#container {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  width: 200px;
  height: 100px;
  .no-motionpath & {
    display: none;
  }
}
#count, .dot {
  motion-path: path('M93.9,46.4c9.3,9.5,13.8,17.9,23.5,17.9s17.5-7.8,17.5-17.5s-7.8-17.6-17.5-17.5c-9.7,0.1-13.3,7.2-22.1,17.1 c-8.9,8.8-15.7,17.9-25.4,17.9s-17.5-7.8-17.5-17.5s7.8-17.5,17.5-17.5S86.2,38.6,93.9,46.4z');
  position: absolute;
}
#count {
  animation: pathy $duration  infinite linear;
  //animation-delay: ($duration / (-6) * 4.5);
  motion-offset: 0;
  color: $primary;
  display: inline-block;
  text-align: center;
}
.dot {
  display: inline-block;
  width: .4rem;
  height: .4rem;
  background: $primary;
  border-radius: 50%;
  opacity: 0;
  animation: pulse $duration infinite ease-in-out;
  
  &:nth-of-type(1) {
    motion-offset: 10%;
    animation-delay: ($duration/10);
  }
  &:nth-of-type(2) {
    motion-offset: 20%;
    animation-delay: ($duration/10 * 2);
  }
  &:nth-of-type(3) {
    motion-offset: 30%;
    animation-delay: ($duration/10 * 3);
  }
  &:nth-of-type(4) {
    motion-offset: 40%;
    animation-delay: ($duration/10 *4);
  }
  &:nth-of-type(5) {
    motion-offset: 50%;
    animation-delay: ($duration/10 * 5);
  }
  &:nth-of-type(6) {
    motion-offset: 60%;
    animation-delay: ($duration/10 * 6);
  }
  &:nth-of-type(7) {
    motion-offset: 70%;
    animation-delay: ($duration/10 * 7);
  }
  &:nth-of-type(8) {
    motion-offset: 80%;
    animation-delay: ($duration/10 * 8);
  }
  &:nth-of-type(9) {
    motion-offset: 90%;
    animation-delay: ($duration/10 * 9);
  }
  &:nth-of-type(10) {
    motion-offset: 0%;
    animation-delay: 0ms;
  }
  
  &:nth-of-type(11) {
    motion-offset: 5%;
    animation-delay: ($duration/20);
  }
  &:nth-of-type(12) {
    motion-offset: 15%;
    animation-delay: ($duration/20 * 3);
  }
  &:nth-of-type(13) {
    motion-offset: 25%;
    animation-delay: ($duration/20 * 5);
  }
  &:nth-of-type(14) {
    motion-offset: 35%;
    animation-delay: ($duration/20 * 7);
  }
  &:nth-of-type(15) {
    motion-offset: 45%;
    animation-delay: ($duration/20 * 9);
  }
  &:nth-of-type(16) {
    motion-offset: 55%;
    animation-delay: ($duration/20 * 11);
  }
  &:nth-of-type(17) {
    motion-offset: 65%;
    animation-delay: ($duration/20 * 13);
  }
  &:nth-of-type(18) {
    motion-offset: 75%;
    animation-delay: ($duration/20 * 15);
  }
  &:nth-of-type(19) {
    motion-offset: 85%;
    animation-delay: ($duration/20 * 17);
  }
  &:nth-of-type(20) {
    motion-offset: 95%;
    animation-delay: ($duration/20 * 19);
  }
}

@keyframes pathy {
  100% {
    motion-offset: 100%;
  }
}
@keyframes pulse {
  20% {
    opacity: 1;
  }
  40% {
    opacity: 0;
  }
}

.message {
  display: none;
  .no-motionpath & {
    display: block;
    color: $primary;
    padding: 1rem;
  }
}

var p = document.getElementById('count');
if (p.style.motionPath !== undefined) {
  var counter = 2;
  p.addEventListener('animationiteration', function(e) {
    p.textContent = (counter++);
  });
} else {
  document.documentElement.classList.add('no-motionpath');
}

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://danielcwilson.com/js/web-animations-next-lite.min.js