- const RING_COUNT = 10;
.container
  .scene
    .plane(style=`--ring-count: ${RING_COUNT}`)
      - let rings = 0;
      while rings < RING_COUNT
        .ring(style=`--index: ${rings};`)
        - rings++;
h1 Tap to restart.        
View Compiled
:root
  --border-width 1.2vmin
  --depth 20vmin
  --stack-height 6vmin
  --scene-size 20vmin
  --ring-percentage 0.6
  --ring-size calc(var(--scene-size) * var(--ring-percentage))
  --ring-transform  calc(100% + (var(--scene-size) * ((1 - var(--ring-percentage)) * 0.5))) 50%
  --plane radial-gradient(hsla(0, 0%, 0%, 0.1) 50%, transparent 65%)
  --ring-shadow hsla(0, 0%, 0%, 0.5)
  --hue-one 320
  --hue-two 210
  --blur 10px
  --speed 1.2s
  --bg hsl(0, 0%, 98%)
  --ring-filter brightness(1) drop-shadow(0 0 0 var(--accent))

*
  box-sizing border-box
  transform-style preserve-3d
  
body
  display grid
  place-items center
  min-height 100vh
  
.container
  height var(--scene-size)
  width var(--scene-size)
  transform translate3d(0, 0, 100vmin) rotateX(-24deg) rotateY(-32deg) rotateX(90deg) translate3d(0, 0, calc((var(--depth) + var(--stack-height)) * -1)) rotate(0deg)
 
.scene
.plane
  height 100%
  width 100%
  position relative
  
.scene
  background hsla(280, 80%, 50%, 0.25)

.plane
  background hsla(200, 80%, 50%, 0.25)
  transform translate3d(0, 0, var(--depth))
  
.ring
  --origin-z calc(var(--stack-height) - (var(--stack-height) / var(--ring-count)) * var(--index))
  --destination-z calc(((var(--depth) + var(--origin-z)) - (var(--stack-height) - var(--origin-z))) * -1)
  --hue var(--hue-one)
  --accent 'hsl(%s 100% 55%)' % var(--hue)
  height var(--ring-size)
  width var(--ring-size)
  border-radius 50%
  border var(--border-width) solid var(--accent)
  position absolute
  top 50%
  left 50%
  transform-origin var(--ring-transform)
  transform translate3d(-50%, -50%, var(--origin-z)) translateZ(var(--destination-z)) rotateY(180deg) 
  animation slink 2s calc(var(--index) * 0.1s) both infinite
  
  &:nth-of-type(odd)
    --hue var(--hue-two)
      
@keyframes slink
  0%, 30%
    transform translate3d(-50%, -50%, var(--origin-z)) translateZ(0) rotateY(0deg) 
  45%
    transform translate3d(-50%, -50%, var(--origin-z)) translateZ(0) rotateY(180deg)
  55%, 100%
    transform translate3d(-50%, -50%, var(--origin-z)) translateZ(var(--destination-z)) rotateY(180deg) 
    
h1
  position fixed
  bottom 1rem
  right 1rem
  color hsl(0, 0%, 25%)
  margin 0
View Compiled
const RESTART = () => {
  const HTML = document.body.innerHTML
  document.body.innerHTML = ''
  requestAnimationFrame(() => document.body.innerHTML = HTML)
}

window.addEventListener('click', RESTART)
View Compiled
Run Pen

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.