DEMOs

导航页

0-50%和50%-100%处理有区别,利用动画的negative animation-delay和animation-play-state: paused可统一处理

30%

60%

.pie {
  width: torem(120px);
  height: torem(120px);
  background-color: color(green);
  background-image: linear-gradient(to right, transparent 50%, color(gray) 0);
  border-radius: 100%;

  &::before {
    content: '';
    display: block;
    height: 100%;
    background-color: inherit;
    border-radius: 0 100% 100% 0 / 50%;
    transform-origin: 0 50%;
    margin-left: 50%;
  }

  &.pie-more::before {
    background-color: color(gray);
  }

  &.pie-animate::before {
    animation: spin 3s linear infinite, bg 6s step-end infinite;
  }

  + p {
    width: torem(120px);
    font-size: torem(14px);
    text-align: center;
  }
}

#percent-30::before {
  transform: rotate(108deg);
}

#percent-60::before {
  transform: rotate(36deg);
}

@keyframes spin {
  to {
    transform: rotate(180deg);
  }
}

@keyframes bg {
  50% {
    background: color(gray);
  }
}