Как анимировать пунктирний круг svg? Эффект лоадера

<svg width="313" height="311" viewBox="0 0 313 311" fill="none" xmlns="http://www.w3.org/2000/svg">
  <path d="M282.54 185.765C299.363 116.6 256.57 46.98 186.96 30.265C117.35 13.5501 47.2822 56.0695 30.4597 125.235C13.6373 194.4 56.4302 264.02 126.04 280.735C195.65 297.45 265.718 254.93 282.54 185.765Z" stroke="url(#paint0_angular_701_334)" stroke-width="18" stroke-miterlimit="10" stroke-dasharray="7.73 7.73"/>
  <path d="M157.5 257.345C213.557 257.345 259 211.97 259 155.997C259 100.024 213.557 54.6484 157.5 54.6484C101.443 54.6484 56 100.024 56 155.997C56 211.97 101.443 257.345 157.5 257.345Z" stroke="#353535" stroke-width="5.67779" stroke-miterlimit="10"/>
  <defs>
    <radialGradient id="paint0_angular_701_334" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(156.5 155.5) rotate(72.1923) scale(134.064 133.263)">
      <stop stop-color="white"/>
      <stop offset="0.0001" stop-color="#929999"/>
      <stop offset="0.618755" stop-color="#929999"/>
      <stop offset="0.620474" stop-color="#40FED4"/>
      <stop offset="0.719982" stop-color="#1894EF"/>
      <stop offset="0.852185" stop-color="#20A9EA"/>
      <stop offset="1" stop-color="#40FED4"/>
    </radialGradient>
  </defs>
</svg>


Ответы (1 шт):

Автор решения: UModeL

Вариант на чистом CSS с использованием conic-gradient() и mask:

/* For example only --> */ body{margin:0;min-height:100vh;background-color:#111;background-image:url("https://i.stack.imgur.com/m9NKc.png"),radial-gradient(#fff8,#000f);background-position:0 0;background-repeat:no-repeat;background-size:auto;display:flex;flex-flow:column nowrap;justify-content:space-around;align-items:center;gap:1em}

.loader {
  font-size: min(2vw, 2vh); /* <-- Масштаб */
  width: 39.5em; height: 39.5em;
  border-radius: 50%;
  background-image: radial-gradient( #0000 0 14.1em, #353535 14.2em 14.9em, #0000 15em);
  overflow: hidden;
}

.sectors {
  position: relative;
  height: 100%;
  -webkit-mask-image: repeating-conic-gradient( #000 0deg 3.061538461538462deg, #0000 3.461538461538462deg 6.923076923076923deg);
}
.sectors::before {
  content: "";
  position: absolute;
  width: 100%; height: 100%;
  background-image: conic-gradient( #3df6d6 0deg, #1ca0ec 42deg 82deg, #3df6d6 122deg, #0000 122deg), radial-gradient(#0000 0 17.1em, #929999 17.2em);
  -webkit-mask-image: radial-gradient(#0000 0 17.1em, #ffaa00 17.2em);
  animation: spin 2s steps(52, end) infinite;
}

@keyframes spin { 100% { transform: rotate(1turn); } }
<div class="loader"><div class="sectors"></div></div>

Хочу заметить, что здесь более уместна метка , так как даже при реализации на SVG, не обойтись без conic-gradient(), который появился именно в CSS3.

Вариант на CSS с заполнением, используя @property:

/* For example only --> */ body{margin:0;min-height:100vh;background-color:#111;background-image:url("https://i.stack.imgur.com/m9NKc.png"),radial-gradient(#fff8,#000f);background-position:0 0;background-repeat:no-repeat;background-size:auto;display:flex;flex-flow:column nowrap;justify-content:space-around;align-items:center;gap:1em}

.loader {
  font-size: min(2vw, 2vh); /* <-- Масштаб */
  width: 39.5em; height: 39.5em;
  border-radius: 50%;
  background-image: radial-gradient( #0000 0 14.1em, #353535 14.2em 14.9em, #0000 15em);
  overflow: hidden;
}

@property --angle {
  syntax: "<percentage>";
  initial-value: 0%;
  inherits: false;
}
.sectors {
  position: relative;
  height: 100%;
  -webkit-mask-image: repeating-conic-gradient( #000 0deg 3.061538461538462deg, #0000 3.461538461538462deg 6.923076923076923deg);
}
.sectors::before {
  content: "";
  position: absolute;
  width: 100%; height: 100%;
  background-image: conic-gradient( #3df6d6 0, #1ca0ec calc(var(--angle) / 7.2) calc(var(--angle) / 1.2), #3df6d6 var(--angle), #0000 var(--angle)), radial-gradient(#0000 0 17.1em, #929999 17.2em);
  -webkit-mask-image: radial-gradient(#0000 0 17.1em, #ffaa00 17.2em);
  animation: spin 2s steps(52, end) infinite;
}

@keyframes spin { 100% { --angle: 100%; } }
<div class="loader"><div class="sectors"></div></div>

P.S.: Дополню ответ, если найду более лаконичное решение на SVG.

→ Ссылка