The Compose logo is an isometric tetromino and I thought it would be fun to shift through other tetromino shapes for a loading animation.
A Pen by Brandon Mathis on CodePen.
The Compose logo is an isometric tetromino and I thought it would be fun to shift through other tetromino shapes for a loading animation.
A Pen by Brandon Mathis on CodePen.
| <div class='tetrominos'> | |
| <div class='tetromino box1'></div> | |
| <div class='tetromino box2'></div> | |
| <div class='tetromino box3'></div> | |
| <div class='tetromino box4'></div> | |
| </div> |
| $w: 96px; | |
| $h: 112px; | |
| $xspace: $w/2; | |
| $yspace: $h/4 - 1; | |
| $speed: 1.5s; | |
| .tetrominos { | |
| position: absolute; | |
| top: 50%; left: 50%; | |
| transform: translate(-$h, -$w); | |
| } | |
| .tetromino { | |
| width: $w; | |
| height: $h; | |
| position: absolute; | |
| transition: all ease .3s; | |
| background: url('data:image/svg+xml;utf-8,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 612 684"%3E%3Cpath fill="%23010101" d="M305.7 0L0 170.9v342.3L305.7 684 612 513.2V170.9L305.7 0z"/%3E%3Cpath fill="%23fff" d="M305.7 80.1l-233.6 131 233.6 131 234.2-131-234.2-131"/%3E%3C/svg%3E') no-repeat top center; | |
| } | |
| .box1 { | |
| animation: tetromino1 $speed ease-out infinite; | |
| } | |
| .box2 { | |
| animation: tetromino2 $speed ease-out infinite; | |
| } | |
| .box3 { | |
| animation: tetromino3 $speed ease-out infinite; | |
| z-index: 2; | |
| } | |
| .box4 { | |
| animation: tetromino4 $speed ease-out infinite; | |
| } | |
| @keyframes tetromino1 { | |
| 0%, 40% { | |
| /* compose logo *//* 1 on 3 *//* L-shape */ | |
| transform: translate(0,0); | |
| } 50% { | |
| /* pre-box */ | |
| transform: translate($xspace,-$yspace); | |
| } 60%, 100% { | |
| /* box *//* compose logo */ | |
| transform: translate($xspace*2,0); | |
| } | |
| } | |
| @keyframes tetromino2 { | |
| 0%, 20% { | |
| /* compose logo *//* 1 on 3 */ | |
| transform: translate($xspace*2, 0px); | |
| } 40%, 100% { | |
| /* L-shape *//* box *//* compose logo */ | |
| transform: translate($xspace*3, $yspace); | |
| } | |
| } | |
| @keyframes tetromino3 { | |
| 0% { | |
| /* compose logo */ | |
| transform: translate($xspace*3, $yspace); | |
| } 20%, 60% { | |
| /* 1 on 3 *//* L-shape *//* box */ | |
| transform: translate($xspace*2, $yspace*2); | |
| } 90%, 100% { | |
| /* compose logo */ | |
| transform: translate($xspace, $yspace); | |
| } | |
| } | |
| @keyframes tetromino4 { | |
| 0%, 60% { | |
| /* compose logo *//* 1 on 3 *//* L-shape *//* box */ | |
| transform: translate($xspace, $yspace); | |
| } 90%, 100% { | |
| /* compose logo */ | |
| transform: translate(0, 0); | |
| } | |
| } |