h1 Tap!
input#checker.sr-only(type="checkbox")
label(for="checker")
.transform
  span rotateX(-24deg)
  span rotateY(32deg)
  span rotateX(90deg)
  span translateZ(calc(var(--depth) + var(--stack-height)) * -1)
- const RING_COUNT = 10;
.container
  .scene
    .plane(style=`--ring-count: ${RING_COUNT}`)
      - let rings = 0;
      while rings < RING_COUNT
        .ring(style=`--index: ${rings};`)
        - rings++;
View Compiled
@property --rotate-x
  initial-value 0deg
  inherits false
  syntax '<angle>'

@property --rotate-y
  initial-value 0deg
  inherits false
  syntax '<angle>'
  
@property --flatten
  initial-value 0deg
  inherits false
  syntax '<angle>'
  
@property --translate-z
  initial-value 0
  inherits false
  syntax '<length>'


:root
  --border-width 1.2vmin
  --depth 20vmin
  --stack-height 6vmin
  --scene-size 20vmin
  --ring-size calc(var(--scene-size) * 0.6)
  --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))
  --transition 0.5s

label
  position fixed
  height 100vmax
  width 100vmax
  top 50%
  left 50%
  z-index 4
  transform translate(-50%, -50%)
  
.sr-only
  position absolute
  width 1px
  height 1px
  padding 0
  margin -1px
  overflow hidden
  clip rect(0, 0, 0, 0)
  white-space nowrap
  border-width 0

*
  box-sizing border-box
  transform-style preserve-3d
  
h1
  font-family sans-serif
  font-size 3rem
  position fixed
  bottom 2rem
  right 2rem
  color hsl(0, 0%, 15%)
  margin 0
  
body
  display grid
  place-items center
  min-height 100vh
  overflow hidden
  
.transform
  display flex
  align-items center
  justify-content center
  position absolute
  flex-wrap wrap
  top 50%
  gap 0.5rem
  transform translate3d(0, -20vmin, 200vmin)
  z-index 3
  
  span
    background hsla(0, 0%, 10%, 0.85)
    padding 0.5rem
    border-radius 0.5rem
    opacity var(--opacity, 0)
    transition opacity var(--transition)
    transition-delay var(--delay, 0)
    font-family sans-serif
    font-weight bold
    color hsl(0, 0%, 100%)
    white-space nowrap
    
    &:nth-of-type(1)
      --delay calc(var(--transition) * 3)
    &:nth-of-type(2)
      --delay calc(var(--transition) * 2)
    &:nth-of-type(3)
      --delay var(--transition)
    &:nth-of-type(4)
      --delay 0s
  
.container
  height var(--scene-size)
  width var(--scene-size)
  transform translate3d(0, 0, 100vmin) rotateX(var(--rotate-x)) rotateY(var(--rotate-y)) rotateX(var(--flatten)) translateZ(var(--translate-z)) rotate(0deg)
  transition --rotate-x var(--transition) calc(var(--transition) * 3), --rotate-y var(--transition) calc(var(--transition) * 2), --flatten var(--transition) var(--transition), --translate-z var(--transition) 0s   
 
:checked ~ .container
  --rotate-x -24deg
  --rotate-y 32deg
  --flatten 90deg
  --translate-z calc((var(--depth) + var(--stack-height)) * -1)
  transition --rotate-x var(--transition) 0s, --rotate-y var(--transition) var(--transition), --flatten var(--transition) calc(var(--transition) * 2), --translate-z var(--transition) calc(var(--transition) * 3)

:checked ~ .transform
  --opacity 1
  
  span
    &:nth-of-type(4)
      --delay calc(var(--transition) * 3)
    &:nth-of-type(3)
      --delay calc(var(--transition) * 2)
    &:nth-of-type(2)
      --delay var(--transition)
    &:nth-of-type(1)
      --delay 0s
  
.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))
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.