<div class='load'></div>
$r: 2.5em; // outer radius of ring
$b: .2*$r; // ring thickness
$u: .5*$b;
$t: 6s;
$e: cubic-bezier(.365,0,.635,1);

@property --p {
  syntax: '<integer>';
  initial-value: 0;
  inherits: true
}

@property --r {
  syntax: '<length-percentage>';
  initial-value: 0px;
  inherits: false
}

@property --x {
  syntax: '<length-percentage>';
  initial-value: 0px;
  inherits: false
}

@property --y {
  syntax: '<length-percentage>';
  initial-value: 0px;
  inherits: false
}

html, body, div, ::after { display: grid }

html { height: 100% }

div, ::before, ::after { grid-area: 1/ 1 } 

body {
  place-items: center;
  background: #171717;
  font: 900 6em cousine;
  
  &::before {
    padding: $r + $b;
    border-radius: $b;
    box-shadow: 4px 4px 13px;
    background: linear-gradient(-45deg, #3e1c33, #814623);
    content: ''
  }
}

.load {
  counter-reset: p var(--p);
  mix-blend-mode: lighten;
  animation: p $t linear infinite;
  
  &::before, &::after {
    background: linear-gradient(-45deg, #d196dd, #fd954e)
  }
  
  &::before {
    --x: #{$u};
    --y: #{$u};
    --r: calc(100% - #{$b}); // inner radius of ring
    --rond: red calc(#{$u} - 1px), #0000 #{$u};
    --mask: 
      radial-gradient(circle at var(--x) var(--y), var(--rond)), 
      radial-gradient(closest-side, 
          #0000 var(--r), 
          red calc(var(--r) + 1px) calc(100% - 1px), 
          #0000), 
      conic-gradient(red calc(var(--p)*1%), #0000 0%), 
      radial-gradient(circle at 50% #{$u}, var(--rond));
    padding: $r; // outer radius of ring
    -webkit-mask: var(--mask);
            mask: var(--mask);
    -webkit-mask-composite: source-over, source-in;
            mask-composite: add, intersect;
    animation: r $t ease-out infinite, 
      x .25*$t $e -.125*$t infinite alternate, 
      y .25*$t $e infinite alternate;
    content: ''
  }
  
  &::after {
    place-items: center;
    -webkit-background-clip: text;
    color: #0000;
    mix-blend-mode: difference;
    content: counter(p) '%'
  }
}

@keyframes p { 50%, 100% { --p: 100 } }

@keyframes r {
  0%, 50% { --r: calc(100% - #{$b}) }
  75%, 100% { --r: -1px }
}

@keyframes x { 100% { --x: calc(100% - #{$u}) } }
@keyframes y { 100% { --y: calc(100% - #{$u}) } }
View Compiled

External CSS

  1. https://codepen.io/thebabydino/pen/evPbxv.scss

External JavaScript

  1. https://codepen.io/thebabydino/pen/evPbxv.js