AI CSS Animations

Dot Burst Loader

Eight dots get sucked into the center, charge up into one swelling dot, then burst back out past their ring with an overshoot. The ring drifts an eighth of a turn every cycle.

Also known as: exploding dots loader, implode explode animation, dots converge loader.

HTML

<div class="ldr-dot-burst" role="status" aria-label="Loading">
  <span style="--i:0"></span><span style="--i:1"></span><span style="--i:2"></span><span style="--i:3"></span>
  <span style="--i:4"></span><span style="--i:5"></span><span style="--i:6"></span><span style="--i:7"></span>
</div>

CSS

.ldr-dot-burst {
  --s: var(--ldr-size, 48px);
  --c: var(--ldr-color, #3b82f6);
  --d: calc(var(--s) / 6.5);
  position: relative;
  width: var(--s);
  height: var(--s);
  animation: ldr-dot-burst-drift 1.6s linear infinite;
}
.ldr-dot-burst::after {
  content: "";
  position: absolute;
  top: calc(50% - var(--d));
  left: calc(50% - var(--d));
  width: calc(var(--d) * 2);
  height: calc(var(--d) * 2);
  border-radius: 50%;
  background: var(--c);
  transform: scale(0);
  animation: ldr-dot-burst-core 1.6s infinite;
}
.ldr-dot-burst span {
  position: absolute;
  top: calc(50% - var(--d) / 2);
  left: calc(50% - var(--d) / 2);
  width: var(--d);
  height: var(--d);
  border-radius: 50%;
  background: var(--c);
  rotate: calc(var(--i) * 45deg);
  animation: ldr-dot-burst-fly 1.6s infinite;
}
@keyframes ldr-dot-burst-fly {
  0%, 82%, 100% { transform: translateY(calc(var(--s) * -0.42)) scale(1); animation-timing-function: cubic-bezier(0.6, 0, 0.9, 0.4); }
  38%, 50%      { transform: translateY(0) scale(0.4); animation-timing-function: cubic-bezier(0.15, 0.9, 0.3, 1.25); }
}
@keyframes ldr-dot-burst-core {
  0%, 32%  { transform: scale(0); }
  40%      { transform: scale(0.9); animation-timing-function: ease-in; }
  49%      { transform: scale(1.15); animation-timing-function: cubic-bezier(0.3, 0, 0.8, 0.2); }
  56%, 100% { transform: scale(0); }
}
@keyframes ldr-dot-burst-drift {
  to { transform: rotate(45deg); }
}

@media (prefers-reduced-motion: reduce) {
  .ldr-dot-burst, .ldr-dot-burst *, .ldr-dot-burst::before, .ldr-dot-burst::after, .ldr-dot-burst *::before, .ldr-dot-burst *::after {
    animation-duration: 3s;
  }
}

Customizing this loader

  • Color: set --ldr-color on the element or a parent. Currently previewing #3b82f6.
  • Size: set --ldr-size. Every dimension in the snippet is derived from it. Currently previewing 64px.
  • Speed: change the duration on the animation shorthand. Delays on the children are relative, so they keep their rhythm.
  • Accessibility: the root carries role="status" and an aria-label so screen readers announce the wait. The reduced-motion rule at the end slows the animation for users who asked for less motion.

Similar loaders