html, body { display: grid; } html { overflow: hidden; height: 100%; } body { --tmpl: repeat(var(--n), 1.125em); grid-template: var(--tmpl)/var(--tmpl); place-content: center; } .tile { --m: calc(.5*(var(--n) - 1)); --abs-i: max(var(--m) - var(--i), var(--i) - var(--m)); --abs-j: max(var(--m) - var(--j), var(--j) - var(--m)); --rat: calc((var(--abs-i)*var(--abs-i) + var(--abs-j)*var(--abs-j))/var(--m)/var(--m)); transform: translate(var(--x), var(--y)); background: #000; animation: a 2s cubic-bezier(0.65, 0, 0.35, 1) calc((var(--rat) - 2)*2s) infinite alternate; } @keyframes a { 0% { transform: scale(0.3333333333); } }