DEMOs

导航页
.longcat-spinner {
  @include flexbox(row, wrap, space-around, center);

  .gilly {
    --face: #ccc;

    background-color: #2c4763;
  }

  .qian {
    --main: #80757b;
    --face: #80757b;
    --shadow: #5d5d60;
    --ears: #5d5d60;
    --nose: #5d5d60;
    --mouth: #5d5d60;
    --belly: #5d5d60;
    // --eyes: #000;

    background-color: #e6e6e6;
  }
}

.cat {
  $angleSpan: 40deg;
  $dur: 2s;
  $delayInc: $dur / 100;
  $segments: 30;

  $negAngleHalf: -$angleSpan / 2;
  $angleInc: $angleSpan / $segments;

  position: relative;
  font-size: torem(16px);
  width: 16em;
  height: 16em;

  &__segment {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 3em;
    height: 2em;

    &::before {
      content: '';
      display: block;
      width: 100%;
      height: 100%;
      background-image: linear-gradient(
        90deg,
        var(--main, #fff) 20%,
        // var(--belly, #e6e6e6) 20% 80%,
        var(--belly, #e6e6e6) 20%,
        var(--belly, #e6e6e6) 80%,
        var(--main, #fff) 80%
      );
      border-radius: 0.25em;
      animation: loop $dur cubic-bezier(0.6, 0, 0.4, 1) infinite;
      will-change: transform;
    }

    &:first-of-type {
      width: 4em;
      height: 4em;
      z-index: 1;

      &::before {
        background-image:
          // mouth
          radial-gradient(0.9em 0.8em at 1.5em 2.65em, var(--main, #fff) 48%, transparent 50%),
          radial-gradient(1em 0.8em at 1.6em 2.75em, var(--mouth, #ccc) 48%, transparent 50%),
          radial-gradient(0.9em 0.8em at 2.5em 2.65em, var(--main, #fff) 48%, transparent 50%),
          radial-gradient(1em 0.8em at 2.4em 2.75em, var(--mouth, #ccc) 48%, transparent 50%),
          // nose
          radial-gradient(0.75em 0.75em at 50% 2.5em, var(--nose, #e59999) 48%, transparent 50%),
          // head
          radial-gradient(4em 3em at 50% 2em, var(--main, #fff) 48%, transparent 50%),
          radial-gradient(4em 3em at 50% 2.2em, var(--shadow, #ccc) 48%, transparent 50%),
          // ears
          radial-gradient(
            1em 3em at 3.25em 1.5em,
            var(--ears, #e59999) 39%,
            // var(--face, #e6e6e6) 40% 49%,
            var(--face, #e6e6e6) 40%,
            var(--face, #e6e6e6) 49%,
            transparent 50%
          ),
          radial-gradient(
            1em 3em at 0.75em 1.5em,
            var(--ears, #e59999) 39%,
            // var(--face, #e6e6e6) 40% 49%,
            var(--face, #e6e6e6) 40%,
            var(--face, #e6e6e6) 49%,
            transparent 50%
          ),
          // paws
          radial-gradient(1em 2em at 0.5em 2.8em, var(--main, #fff) 48%, transparent 50%),
          radial-gradient(1em 2em at 0.5em 3em, var(--shadow, #ccc) 48%, transparent 50%),
          radial-gradient(1em 2em at 3.5em 2.8em, var(--main, #fff) 48%, transparent 50%),
          radial-gradient(1em 2em at 3.5em 3em, var(--shadow, #ccc) 48%, transparent 50%);
        background-repeat: no-repeat;
      }

      &::after {
        content: '';
        position: absolute;
        top: 0;
        left: 0;
        display: block;
        width: 100%;
        height: 100%;
        background-image:
          // eyes
          radial-gradient(0.25em 0.25em at 1.25em 1.6em, #fff 48%, transparent 50%),
          radial-gradient(0.75em 0.75em at 1.25em 1.75em, var(--eyes, #000) 48%, transparent 50%),
          radial-gradient(0.25em 0.25em at 2.75em 1.6em, #fff 48%, transparent 50%),
          radial-gradient(0.75em 0.75em at 2.75em 1.75em, var(--eyes, #000) 48%, transparent 50%),
          // face
          radial-gradient(4.8em 4.8em at 0 0, var(--face, #fff) 48%, transparent 50%),
          radial-gradient(4.8em 4.8em at 100% 0, var(--face, #fff) 48%, transparent 50%);
        clip-path: ellipse(2em 1.5em);
        animation: loop $dur cubic-bezier(0.6, 0, 0.4, 1) infinite;
        will-change: transform;
      }
    }

    &:last-of-type {
      width: 3em;
      height: 4em;

      &::before {
        background:
          // body
          linear-gradient(
            90deg,
            var(--main, #fff) 20%,
            // var(--belly, #e6e6e6) 20% 80%,
            var(--belly, #e6e6e6) 20%,
            var(--belly, #e6e6e6) 80%,
            var(--main, #fff) 80%
          ) 0 1.5em / 3em 0.5em,
          radial-gradient(
            3em 2em at top center,
            var(--belly, #e6e6e6) 30%,
            // var(--main, #fff) 31% 48%,
            var(--main, #fff) 31%,
            var(--main, #fff) 48%,
            transparent 50%
          ) 0 2em /  3em 2em,
          // paws
          radial-gradient(
            1em 4em at 0.5em 0,
            var(--main, #fff) 48%,
            transparent 50%
          ) 0 2em / 3em 2em,
          radial-gradient(
            1em 4em at 2.5em 0,
            var(--main, #fff) 48%,
            transparent 50%
          ) 0 2em / 3em 2em;
        background-repeat: no-repeat;
      }
    }

    @for $s from 1 through $segments {
      $rotateBy: $angleSpan / $segments * ($s - 1);

      &:nth-of-type(#{$s}) {
        transform: translate(-50%, -50%) rotate($negAngleHalf + $rotateBy);

        &::before,
        &::after {
          animation-delay: $delayInc * ($s - 1);
          transform: translateX(6em);
        }
      }
    }
  }
}

@keyframes loop {
  from {
    transform: rotate(0) translateX(6em);
  }

  to {
    transform: rotate(-1turn) translateX(6em);
  }
}