查看原文
其他

【每日一练】95—CSS 3D加载动画进度效果的实现

杨小爱 web前端开发 2022-11-11


写在前面

关于学习CSS,其实最好的办法也是最笨的办法,先不管它有没有用,在你不会之前,先上电脑把代码敲起来再说。

因为没有一个人是把所有的基础知识都学明白了学会了,才开始去敲代码的。

像CSS里有那么多元素属性,我想,没有谁会把所有的属性元素搞明白了,然后再去开始写CSS的,那样的话,他早就放弃了。

如果你坚持写到今天还没有放弃的话,那就继续练下去,今天是我们的第95个练习案例,距离我们之前定的100小练习的目标越来越近了,大家继续加油!

现在,我们还是一起来看看今天练习的最终练习效果:

HTML代码:
<!DOCTYPE html><html><head>  <title>【每日一练】95—CSS 3D加载动画进度效果的实现</title></head><body> <div class="container"> <div class="box"> <div class="shadow"></div> <div class="content">        <div class="percent" data-text="Html" style="--num:88;"> <div class="dot"></div> <svg> <circle cx="70" cy="70" r="70"></circle> <circle cx="70" cy="70" r="70"></circle> </svg> </div> <div class="number"> <h2>88<span>%</span></h2> </div> </div> </div> <div class="box"> <div class="shadow"></div> <div class="content">        <div class="percent" data-text="CSS" style="--num:95;"> <div class="dot"></div> <svg> <circle cx="70" cy="70" r="70"></circle> <circle cx="70" cy="70" r="70"></circle> </svg> </div> <div class="number"> <h2>95<span>%</span></h2> </div> </div>    </div> <div class="box"> <div class="shadow"></div> <div class="content">        <div class="percent" data-text="JS" style="--num:80;"> <div class="dot"></div> <svg> <circle cx="70" cy="70" r="70"></circle> <circle cx="70" cy="70" r="70"></circle> </svg> </div> <div class="number"> <h2>80<span>%</span></h2> </div> </div> </div> </div></body></html>
CSS代码:
*{ margin: 0; padding: 0; box-sizing: border-box; font-family: consolas;}body { display: flex; justify-content: center; align-items: center; min-height: 100vh; overflow: hidden; background: #cfd1e1;}.container { display: flex; justify-content: center; align-items: center; gap: 80px 100px; flex-wrap: wrap;}.container .box { position: relative; width: 240px; height: 250px; display: flex; justify-content: center; align-items: center;}.container .box::before { content: ''; position: absolute; top: 0; left: 0; width: 20px; height: 100%; background: linear-gradient(#fff,#fff,#e3e3e3); filter: blur(1px); z-index: 1;}.container .box::after { content: ''; position: absolute; top: 1px; right: -1px; width: 20px; height: 100%; background: #9d9d9d; filter: blur(1px); z-index: 1;}.container .box .shadow { position: absolute; width: 100%; height: 100%; background: #eee;}.container .box .shadow::before { content: ''; position: absolute; top: 0; left: calc(100% + 5px); width: 100%; height: 200%; background: linear-gradient(rgba(0,0,0,0.075),transparent); transform: skewX(45deg);}.container .box .shadow::after { content: ''; position: absolute; bottom: -200%; left: calc(100% + 15px); width: 100%; height: 200%; background: linear-gradient(rgba(0,0,0,0.075),transparent); transform: skewX(45deg);}.container .box .content { position: relative; width: 100%; height: 100%; background: linear-gradient(#dbdae1,#a3aaba); box-shadow: 5px 5px 5px rgba(0,0,0,0.1), 15px 15px 15px rgba(0,0,0,0.1), 20px 20px 20px rgba(0,0,0,0.1), 50px 50px 50px rgba(0,0,0,0.1), inset 3px 3px 2px #fff; display: flex; justify-content: center; align-items: center; flex-direction: column;}.container .box .content .percent { position: relative; width: 150px; height: 150px;}.container .box .content .percent::before { content: attr(data-text); position: absolute; inset: 20px; background: #00a6bc; border-radius: 50%; display: flex; justify-content: center; align-items: center; color: #fff; font-size: 1.5em; letter-spacing: 0.1em; text-transform: uppercase;}.container .box .content .percent svg { position: relative; width: 150px; height: 150px; transform: rotate(270deg);}.container .box .content .percent svg circle { width: 100%; height: 100%; fill: transparent; stroke-width: 3; stroke: rgba(0,0,0,0.05); transform: translate(5px,5px);}.container .box .content .percent svg circle:nth-child(2){ stroke: #00a6bc; stroke-dasharray: 440; stroke-dashoffset: calc(440 - (440 * var(--num)) / 100); opacity: 0; animation: fadeIn 1s linear forwards; animation-delay: 2.5s;}@keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; }}.container .box .content .percent .dot { position: absolute; inset: 5px; z-index: 10; animation: animateDot 2s linear forwards;}@keyframes animateDot { 0% { transform: rotate(0deg); } 100% { transform: rotate(calc(3.6deg * var(--num))); /* 360 / 100 = 3.6deg */ }}.container .box .content .percent .dot::before { content: ''; position: absolute; top: -7px; left: 50%; transform: translateX(-50%); width: 14px; height: 14px; background: #00a6bc; border-radius: 50%;}.container .box .content .number { position: relative; inset: 0; opacity: 0; animation: fadeIn 1s linear forwards; animation-delay: 2.5s;}.container .box .content .number h2 { font-size: 2.5em; color: #00a6bc; display: flex; justify-content: center; align-items: center;}.container .box .content .number h2 span { font-weight: 300; font-size: 0.5em; margin-left: 5px;}

写在最后

到这里,我今天跟你分享的【每日一练】的全部内容就结束了,希望今天的小练习对你有用,如果你觉得有帮助的话,请点赞我,关注我,并将它分享给你身边做开发的朋友,也许能够帮助到他。

我是杨小爱,我们明天见。

学习更多技能

请点击下方公众号

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存