Effect preview
Online demo
Press the "click preview" button on the right to preview on the current page, and click the link to preview in full screen.
https://codepen.io/comehope/pen/PBGJwL
Interactive video
This video is interactive. You can pause the video at any time and edit the code in the video.
Please use chrome, safari, edge to open and watch.
https://scrimba.com/p/pEgDAM/cDMyyHv
Source code download
Download locally
Please download all the source code of the daily front-end combat series from github:
https://github.com/comehope/front-end-daily-challenges
Code interpretation
Define dom. The container contains 5 elements, representing 5 steps:
<div class="loader"> <span></span> <span></span> <span></span> <span></span> <span></span> </div>
Center:
body { margin: 0; height: 100vh; display: flex; align-items: center; justify-content: center; background-color: black; }
Define container size:
.loader { width: 7em; height: 5em; font-size: 40px; }
Draw 5 steps:
.loader { display: flex; justify-content: space-between; align-items: flex-end; } .loader span { width: 1em; height: 1em; background-color: white; }
Use variables to rank 5 steps from low to high:
.loader span { height: calc(var(--n) * 1em); } .loader span:nth-child(1) { --n: 1; } .loader span:nth-child(2) { --n: 2; } .loader span:nth-child(3) { --n: 3; } .loader span:nth-child(4) { --n: 4; } .loader span:nth-child(5) { --n: 5; }
Add animation to transform sort direction for steps:
.loader span { animation: sort 5s infinite; } @keyframes sort { 0%, 40%, 100% { height: calc(var(--n) * 1em); } 50%, 90% { height: calc(5em - (var(--n) - 1) * 1em); } }
Now we do the animation of the little ball. We use the blindfold method to make the alternating motion of two small balls of the same color look like a little ball doing the reciprocating motion.
Draw 2 balls with pseudo elements:
.loader::before, .loader::after { content: ''; position: absolute; width: 1em; height: 1em; background-color: white; border-radius: 50%; bottom: 1em; } .loader::before { left: 0; } .loader::after { left: 6em; }
Increase the animation effect of making the ball move upward:
.loader::before, .loader::after { animation: climbing 5s infinite; visibility: hidden; } .loader::after { animation-delay: 2.5s; } @keyframes climbing { 0% { bottom: 1em; visibility: visible; } 10% { bottom: 2em; } 20% { bottom: 3em; } 30% { bottom: 4em; } 40% { bottom: 5em; } 50% { bottom: 1em; } 50%, 100% { visibility: hidden; } }
When moving upward, it moves to both sides to form the animation effect of ascending steps:
.loader::before { --direction: 1; } .loader::after { --direction: -1; } @keyframes climbing { 0% { bottom: 1em; left: calc(3em - 2 * 1.5em * var(--direction)); visibility: visible; } 10% { bottom: 2em; left: calc(3em - 1 * 1.5em * var(--direction)); } 20% { bottom: 3em; left: calc(3em - 0 * 1.5em * var(--direction)); } 30% { bottom: 4em; left: calc(3em + 1 * 1.5em * var(--direction)); } 40% { bottom: 5em; left: calc(3em + 2 * 1.5em * var(--direction)); } 50% { bottom: 1em; left: calc(3em + 2 * 1.5em * var(--direction)); } 50%, 100% { visibility: hidden; } }
Finally, the anthropomorphic effect is added to the step up action:
@keyframes climbing { 0% { bottom: 1em; left: calc(3em - 2 * 1.5em * var(--direction)); visibility: visible; } 7% { bottom: calc(2em + 0.3em); } 10% { bottom: 2em; left: calc(3em - 1 * 1.5em * var(--direction)); } 17% { bottom: calc(3em + 0.3em); } 20% { bottom: 3em; left: calc(3em - 0 * 1.5em * var(--direction)); } 27% { bottom: calc(4em + 0.3em); } 30% { bottom: 4em; left: calc(3em + 1 * 1.5em * var(--direction)); } 37% { bottom: calc(5em + 0.3em); } 40% { bottom: 5em; left: calc(3em + 2 * 1.5em * var(--direction)); } 50% { bottom: 1em; left: calc(3em + 2 * 1.5em * var(--direction)); } 50%, 100% { visibility: hidden; } }
be accomplished!
Original address: https://segmentfault.com/a/119000015686159