A collection of preload animations made using only two triangles, whether they look like practical ones or just plain weird
A Pen by Jon Kantner on CodePen.
DEMO : https://codemyui.com/dual-triangle-loading-animations/
A collection of preload animations made using only two triangles, whether they look like practical ones or just plain weird
A Pen by Jon Kantner on CodePen.
DEMO : https://codemyui.com/dual-triangle-loading-animations/
| <main> | |
| <div class="cell"> | |
| <div class="pl pl-bow"></div> | |
| <div class="pl-name">Bow</div> | |
| </div> | |
| <div class="cell"> | |
| <div class="pl pl-butterfly"></div> | |
| <div class="pl-name">Butterfly</div> | |
| </div> | |
| <div class="cell"> | |
| <div class="pl pl-fade"></div> | |
| <div class="pl-name">Fade</div> | |
| </div> | |
| <div class="cell"> | |
| <div class="pl pl-flip"></div> | |
| <div class="pl-name">Flip</div> | |
| </div> | |
| <div class="cell"> | |
| <div class="pl pl-hourglass"></div> | |
| <div class="pl-name">Hourglass</div> | |
| </div> | |
| <div class="cell"> | |
| <div class="pl pl-kinetic"></div> | |
| <div class="pl-name">Kinetic</div> | |
| </div> | |
| <div class="cell"> | |
| <div class="pl pl-leapfrog"></div> | |
| <div class="pl-name">Leap Frog</div> | |
| </div> | |
| <div class="cell"> | |
| <div class="pl pl-origami"></div> | |
| <div class="pl-name">Origami</div> | |
| </div> | |
| <div class="cell"> | |
| <div class="pl pl-puzzle"></div> | |
| <div class="pl-name">Puzzle</div> | |
| </div> | |
| <div class="cell"> | |
| <div class="pl pl-spark"></div> | |
| <div class="pl-name">Spark</div> | |
| </div> | |
| <div class="cell"> | |
| <div class="pl pl-star"></div> | |
| <div class="pl-name">Star</div> | |
| </div> | |
| <div class="cell"> | |
| <div class="pl pl-tuckbehind"></div> | |
| <div class="pl-name">Tuck Behind</div> | |
| </div> | |
| </main> |
| * { | |
| border: 0; | |
| box-sizing: border-box; | |
| margin: 0; | |
| padding: 0; | |
| } | |
| :root { | |
| font-size: calc(16px + (24 - 16)*(100vw - 320px)/ (1920 - 320)); | |
| } | |
| body { | |
| background: #f1f1f1; | |
| font: 1em "Titillium Web", sans-serif; | |
| color: #171717; | |
| line-height: 1.5; | |
| } | |
| /** Container **/ | |
| main { | |
| display: flex; | |
| flex-wrap: wrap; | |
| } | |
| .cell { | |
| flex-basis: 50%; | |
| padding: 1.5em; | |
| } | |
| /** Global preloader styles **/ | |
| .pl, .pl:before, .pl:after { | |
| animation-duration: 2s; | |
| animation-timing-function: linear; | |
| animation-iteration-count: infinite; | |
| } | |
| .pl { | |
| margin: 0 auto 1.5em auto; | |
| position: relative; | |
| width: 3em; | |
| height: 3em; | |
| } | |
| .pl:before, .pl:after { | |
| background: currentColor; | |
| content: ""; | |
| display: block; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 50%; | |
| transform-origin: 50% 100%; | |
| clip-path: polygon(0 0,100% 0,50% 100%); | |
| -webkit-clip-path: polygon(0 0,100% 0,50% 100%); | |
| } | |
| .pl-name { | |
| text-align: center; | |
| } | |
| /** Styles for individual preloaders **/ | |
| /* Bow */ | |
| .pl-bow { | |
| animation-name: bowA; | |
| } | |
| .pl-bow:after { | |
| transform: rotate(180deg); | |
| } | |
| @keyframes bowA { | |
| from { transform: scale(1,1) rotate(0turn) } | |
| 25%, 35%, 50% { transform: scale(1,1) rotate(0.75turn) } | |
| 30% { transform: scale(1.25,1) rotate(0.75turn) } | |
| 75%, 85%, to { transform: scale(1,1) rotate(1.5turn) } | |
| 80% { transform: scale(1,1.25) rotate(1.5turn) } | |
| } | |
| /* Butterfly */ | |
| .pl-butterfly { | |
| animation-name: butterflyA; | |
| } | |
| .pl-butterfly:before { | |
| animation-name: butterflyB; | |
| } | |
| .pl-butterfly:after { | |
| animation-name: butterflyC; | |
| } | |
| @keyframes butterflyA { | |
| from, to { transform: translateY(0) } | |
| 50% { transform: translateY(25%) } | |
| } | |
| @keyframes butterflyB { | |
| from, 50%, to { transform: rotate(60deg) } | |
| 25%, 75% { transform: rotate(120deg) } | |
| } | |
| @keyframes butterflyC { | |
| from, 50%, to { transform: rotate(300deg) } | |
| 25%, 75% { transform: rotate(240deg) } | |
| } | |
| /* Fade */ | |
| .pl-fade:before { | |
| animation-name: fadeA; | |
| } | |
| .pl-fade:after { | |
| animation-name: fadeB; | |
| } | |
| @keyframes fadeA { | |
| from, to { opacity: 1; transform: rotate(0deg) } | |
| 25%, 75.1% { opacity: 0; transform: rotate(0deg) } | |
| 25.1%, 75% { opacity: 0; transform: rotate(180deg) } | |
| 50% { opacity: 1; transform: rotate(180deg) } | |
| } | |
| @keyframes fadeB { | |
| from, 50% { opacity: 0; transform: rotate(90deg) } | |
| 25% { opacity: 1; transform: rotate(90deg) } | |
| 50.1%, to { opacity: 0; transform: rotate(270deg) } | |
| 75% { opacity: 1; transform: rotate(270deg) } | |
| } | |
| /* Flip */ | |
| .pl-flip { | |
| animation-name: flipA; | |
| animation-timing-function: steps(1); | |
| } | |
| .pl-flip:before, .pl-flip:after { | |
| transform-origin: 50% 50%; | |
| } | |
| .pl-flip:before { | |
| animation-name: flipB; | |
| } | |
| .pl-flip:after { | |
| animation-name: flipC; | |
| } | |
| @keyframes flipA { | |
| from, 75%, to { transform: rotate(0) } | |
| 25%, 50% { transform: rotate(90deg) } | |
| } | |
| @keyframes flipB { | |
| from { transform: translateY(0) rotateX(0deg) } | |
| 6.25% { transform: translateY(0) rotateX(0deg) } | |
| 12.5% { transform: translateY(-50%) rotateX(90deg) } | |
| 18.75% { transform: translateY(0) rotateX(180deg) } | |
| 31.25% { transform: translateY(0) rotateX(180deg) } | |
| 37.5% { transform: translateY(-50%) rotateX(270deg) } | |
| 43.75% { transform: translateY(0) rotateX(360deg) } | |
| 50% { transform: translateY(0) rotateX(360deg) } | |
| 56.25% { transform: translateY(0) rotateX(360deg) } | |
| 62.5% { transform: translateY(-50%) rotateX(450deg) } | |
| 68.75% { transform: translateY(0) rotateX(540deg) } | |
| 81.25% { transform: translateY(0) rotateX(540deg) } | |
| 87.5% { transform: translateY(-50%) rotateX(630deg) } | |
| 93.75% { transform: translateY(0) rotateX(720deg) } | |
| to { transform: translateY(0) rotateX(720deg) } | |
| } | |
| @keyframes flipC { | |
| from { transform: translateY(100%) rotateZ(180deg) rotateX(0deg) } | |
| 6.25% { transform: translateY(100%) rotateZ(180deg) rotateX(0deg) } | |
| 12.5% { transform: translateY(150%) rotateZ(180deg) rotateX(90deg) } | |
| 18.75% { transform: translateY(100%) rotateZ(180deg) rotateX(180deg) } | |
| 31.25% { transform: translateY(100%) rotateZ(180deg) rotateX(180deg) } | |
| 37.5% { transform: translateY(150%) rotateZ(180deg) rotateX(270deg) } | |
| 43.75% { transform: translateY(100%) rotateZ(180deg) rotateX(360deg) } | |
| 50% { transform: translateY(100%) rotateZ(180deg) rotateX(360deg) } | |
| 56.25% { transform: translateY(100%) rotateZ(180deg) rotateX(360deg) } | |
| 62.5% { transform: translateY(150%) rotateZ(180deg) rotateX(450deg) } | |
| 68.75% { transform: translateY(100%) rotateZ(180deg) rotateX(540deg) } | |
| 81.25% { transform: translateY(100%) rotateZ(180deg) rotateX(540deg) } | |
| 87.5% { transform: translateY(150%) rotateZ(180deg) rotateX(630deg) } | |
| 93.75% { transform: translateY(100%) rotateZ(180deg) rotateX(720deg) } | |
| to { transform: translateY(100%) rotateZ(180deg) rotateX(720deg) } | |
| } | |
| /* Hourglass */ | |
| .pl-hourglass { | |
| animation-name: hourglassA; | |
| background: #a3a3a3; | |
| clip-path: polygon(0 0,100% 0,50% 50%,100% 100%,0 100%,50% 50%); | |
| -webkit-clip-path: polygon(0 0,100% 0,50% 50%,100% 100%,0 100%,50% 50%); | |
| } | |
| .pl-hourglass:before, .pl-hourglass:after { | |
| position: static; | |
| clip-path: none; | |
| -webkit-clip-path: none; | |
| } | |
| .pl-hourglass:before { | |
| animation-name: hourglassB; | |
| } | |
| .pl-hourglass:after { | |
| animation-name: hourglassC; | |
| } | |
| @keyframes hourglassA { | |
| from, 75% { transform: rotate(0) } | |
| to { transform: rotate(180deg) } | |
| } | |
| @keyframes hourglassB { | |
| from { transform: scaleY(1) } | |
| 50%, to { transform: scaleY(0) } | |
| } | |
| @keyframes hourglassC { | |
| from { transform: scaleY(0) } | |
| 50%, to { transform: scaleY(1) } | |
| } | |
| /* Kinetic */ | |
| .pl-kinetic:before { | |
| animation-name: kineticA; | |
| } | |
| .pl-kinetic:after { | |
| animation-name: kineticB; | |
| } | |
| @keyframes kineticA { | |
| from, 25% { transform: rotate(0deg) } | |
| 50%, 75% { transform: rotate(180deg) } | |
| to { transform: rotate(360deg) } | |
| } | |
| @keyframes kineticB { | |
| from { transform: rotate(90deg) } | |
| 25%, 50% { transform: rotate(270deg) } | |
| 75%, to { transform: rotate(450deg) } | |
| } | |
| /* Leap Frog */ | |
| .pl-leapfrog:before, .pl-leapfrog:after { | |
| clip-path: polygon(0 0,100% 0,0 100%); | |
| -webkit-clip-path: polygon(0 0,100% 0,0 100%); | |
| top: 50%; | |
| left: 50%; | |
| width: 70.71%; | |
| height: 70.71%; | |
| transform-origin: 0 0; | |
| } | |
| .pl-leapfrog:before { | |
| animation-name: leapFrogA; | |
| } | |
| .pl-leapfrog:after { | |
| animation-name: leapFrogB; | |
| background: #a3a3a3; | |
| } | |
| @keyframes leapFrogA { | |
| from { transform: rotateZ(-135deg) rotateY(0deg) rotateX(0deg); z-index: 0 } | |
| 12.5% { transform: rotateZ(-135deg) rotateY(-180deg) rotateX(0deg); z-index: 1 } | |
| 25%, 50% { transform: rotateZ(-135deg) rotateY(-180deg) rotateX(-180deg); z-index: 0 } | |
| 62.5% { transform: rotateZ(-135deg) rotateY(0deg) rotateX(-180deg); z-index: 1 } | |
| 75%, to { transform: rotateZ(-135deg) rotateY(0deg) rotateX(-360deg); z-index: 0 } | |
| } | |
| @keyframes leapFrogB { | |
| from, 25% { transform: rotateZ(-45deg) rotateY(0deg) rotateX(0deg); z-index: 0 } | |
| 37.5% { transform: rotateZ(-45deg) rotateY(-180deg) rotateX(0deg); z-index: 1 } | |
| 50%, 75% { transform: rotateZ(-45deg) rotateY(-180deg) rotateX(-180deg); z-index: 0 } | |
| 87.5% { transform: rotateZ(-45deg) rotateY(0deg) rotateX(-180deg); z-index: 1 } | |
| to { transform: rotateZ(-45deg) rotateY(0deg) rotateX(-360deg); z-index: 0 } | |
| } | |
| /* Origami */ | |
| .pl-origami { | |
| animation-name: origamiA; | |
| animation-timing-function: steps(4); | |
| } | |
| .pl-origami:before, .pl-origami:after { | |
| clip-path: polygon(50% 0,100% 100%,0% 100%); | |
| -webkit-clip-path: polygon(50% 0,100% 100%,0% 100%); | |
| } | |
| .pl-origami:before { | |
| animation-name: origamiB; | |
| } | |
| .pl-origami:after { | |
| animation-name: origamiC; | |
| transform: rotate(180deg); | |
| } | |
| @keyframes origamiA { | |
| from { transform: rotate(0) } | |
| to { transform: rotate(-360deg) } | |
| } | |
| @keyframes origamiB { | |
| from, 25%, 50%, 75%, to { opacity: 1; transform: translateZ(0) rotateX(0deg) } | |
| 12.5%, 62.5% { opacity: 1; transform: translateZ(1px) rotateX(-180deg) } | |
| 37.5%, 87.5% { opacity: 0; transform: translateZ(0) rotateX(0deg) } | |
| } | |
| @keyframes origamiC { | |
| from, 25%, 50%, 75%, to { opacity: 1; transform: translateZ(0) rotateZ(180deg) rotateX(0deg) } | |
| 12.5%, 62.5% { opacity: 0; transform: translateZ(0) rotateZ(180deg) rotateX(0deg) } | |
| 37.5%, 87.5% { opacity: 1; transform: translateZ(1px) rotateZ(180deg) rotateX(-180deg) } | |
| } | |
| /* Puzzle */ | |
| .pl-puzzle:before, .pl-puzzle:after { | |
| transform-origin: 50% 50%; | |
| } | |
| .pl-puzzle:before { | |
| animation-name: puzzleA; | |
| } | |
| .pl-puzzle:after { | |
| animation-name: puzzleB; | |
| background: #a3a3a3; | |
| } | |
| @keyframes puzzleA { | |
| from { transform: translate(0,0) scale(1) rotate(0deg); z-index: 1 } | |
| 12.5% { transform: translate(0,50%) scale(1.5) rotate(-90deg); z-index: 1 } | |
| 25%, 50.1% { transform: translate(0,100%) scale(1) rotate(-180deg); z-index: 1 } | |
| 25.1%, 50% { transform: translate(0,100%) scale(1) rotate(-180deg); z-index: 0 } | |
| 62.5% { transform: translate(0,50%) scale(1.5) rotate(-270deg); z-index: 1 } | |
| 75% { transform: translate(0,0) scale(1) rotate(-360deg); z-index: 1 } | |
| to { transform: translate(0,0) scale(1) rotate(-360deg); z-index: 0 } | |
| } | |
| @keyframes puzzleB { | |
| from { transform: translate(25%,50%) scale(1) rotate(90deg); z-index: 0 } | |
| 25% { transform: translate(25%,50%) scale(1) rotate(90deg); z-index: 0 } | |
| 25.1% { transform: translate(25%,50%) scale(1) rotate(90deg); z-index: 1 } | |
| 37.5% { transform: translate(0,50%) scale(1.5) rotate(0deg); z-index: 1 } | |
| 50%, 75.1% { transform: translate(-25%,50%) scale(1) rotate(-90deg); z-index: 1 } | |
| 50.1%, 75% { transform: translate(-25%,50%) scale(1) rotate(-90deg); z-index: 0 } | |
| 87.5% { transform: translate(0,50%) scale(1.5) rotate(-180deg); z-index: 1 } | |
| to { transform: translate(25%,50%) scale(1) rotate(-270deg); z-index: 1 } | |
| } | |
| /* Spark */ | |
| .pl-spark:before { | |
| animation-name: scaleA; | |
| } | |
| .pl-spark:after { | |
| animation-name: scaleB; | |
| } | |
| @keyframes scaleA { | |
| from, 50%, to { transform: scale(1) } | |
| 25%, 75% { transform: scale(-1) } | |
| } | |
| @keyframes scaleB { | |
| from, 50%, to { transform: rotate(90deg) scale(0) } | |
| 12.5%, 62.5% { transform: rotate(90deg) scale(1) } | |
| 37.5%, 87.5% { transform: rotate(90deg) scale(-1) } | |
| } | |
| /* Star */ | |
| .pl-star { | |
| animation-name: starA; | |
| } | |
| .pl-star:after { | |
| transform: rotate(180deg); | |
| } | |
| @keyframes starA { | |
| from, to { opacity: 1; transform: rotate(0deg) scale(1) } | |
| 25%, 75.1% { opacity: 0; transform: rotate(0deg) scale(0) } | |
| 25.1%, 75% { opacity: 0; transform: rotate(90deg) scale(0) } | |
| 50% { opacity: 1; transform: rotate(90deg) scale(1) } | |
| } | |
| /* Tuck Behind */ | |
| .pl-tuckbehind:before { | |
| animation-name: tuckBehindA; | |
| } | |
| .pl-tuckbehind:after { | |
| animation-name: tuckBehindB; | |
| background: #a3a3a3; | |
| } | |
| @keyframes tuckBehindA { | |
| from { transform: rotate(0); z-index: 1 } | |
| 25% { transform: rotate(180deg); z-index: 0 } | |
| 50%, to { transform: rotate(360deg); z-index: 0 } | |
| } | |
| @keyframes tuckBehindB { | |
| from, 50% { transform: rotate(0); z-index: 0 } | |
| 75% { transform: rotate(180deg); z-index: -1 } | |
| to { transform: rotate(360deg); z-index: -1 } | |
| } | |
| /** Media queries **/ | |
| @media (prefers-color-scheme: dark) { | |
| body { | |
| background: #171717; | |
| color: #f1f1f1; | |
| } | |
| .pl-hourglass, .pl-leapfrog:after, .pl-puzzle:after, .pl-tuckbehind:after { | |
| background: #575757; | |
| } | |
| } | |
| @media screen and (min-width: 768px) { | |
| .cell { | |
| flex-basis: 33.33%; | |
| } | |
| } | |
| @media screen and (min-width: 1280px) { | |
| .cell { | |
| flex-basis: 25%; | |
| } | |
| } |
| <link href="https://fonts.googleapis.com/css?family=Titillium+Web&display=swap" rel="stylesheet" /> |