CSS100Day(10)-SVG旋转动画

901 字
5 分钟
CSS100Day(10)-SVG旋转动画

设计简介#

本次练习主要做个旋转的圈,使用SVG的圆stroke来实现,其中有两个关键点:

  1. 关键点1:stroke-dasharray属性表示svg边实线和虚线数组,如果该属性值大于SVG整个长度,则全部实现,例如:周长100,该属性设置50,那么实线50,虚线50

    stroke-dashoffset属性表示有点类似“延迟”的概念,就是实现延迟(左移)长度,即如果svg线(圆)长度100,该属性设置50,stroke-dasharray设置100,那么实线延迟了50,长度为50

  2. 关键点2:做到spinner在翻转,使用rotate是做不到的,需要scaleY(-1),按Y轴旋转,看@keyframe spin代码

效果展示#

20150115,星期四
11:42
1248 大卡

实现代码和步骤#

HTML部分#

HTML就是绘制svg的一个圆

<div class="frame">
<div class="center">
<svg class="spinner" viewbox="0 0 202 202" xmlns="https://www.w3.org/2000/svg">
<circle cx="101" cy="101" r="99.5"></circle>
</svg>
<div class="date">20150115,星期四</div>
<div class="time">11:42</div>
<img class="beat" src="./heart.svg" alt="心跳" />
<div class="energy">1248 大卡</div>
</div>
</div>

CSS部分#

非关键部分如下,主要是其他内容

:root {
--speed: 3s;
}
.frame {
width: 400px;
height: 400px;
box-shadow: 1px 2px 10px 0 rgba(0, 0, 0, 0.3);
background: #4c4c4c;
color: #fff;
font-size: 12px;
line-height: 100%;
text-transform: uppercase;
border-radius: 2px;
}
.center {
position: absolute;
width: 212px;
height: 212px;
top: 87px;
left: 87px;
background: #242424;
border: 7px solid #3a3a3a;
border-radius: 50%;
text-align: center;
}
.date {
position: absolute;
top: 68px;
width: 100%;
}
.time {
position: absolute;
top: 80px;
width: 100%;
font-weight: 700;
font-size: 40px;
line-height: 100%;
margin: 4px 0;
}
.beat {
position: absolute;
left: 50%;
top: 125px;
width: 20px;
height: 20px;
transform: translateX(-220%);
animation: beat 0.8s ease-in-out infinite alternate-reverse;
}
.energy {
position: absolute;
top: 128px;
left: 50%;
transform: translateX(-30%);
}
@keyframes beat {
0% {
scale: 1;
transform: translateX(-220%);
}
100% {
scale: 1.2;
transform: translateX(-185%);
}
}

关键部分就是svg的两个关键属性stroke-dasharraystroke-dashoffset

其次就是最关键的scaleY(-1)

.spinner {
position: absolute;
width: 202px;
height: 202px;
border-radius: 50%;
top: 5px;
left: 5px;
circle {
stroke: #f85b58;
stroke-width: 3px;
fill: none;
/* 实线长度-一个也表示虚线长度-目前625就是周长 */
stroke-dasharray: 625;
transform-origin: 50% 50%;
/* 默认svg圆开始从右边开始,所以这里旋转到顶部开始 */
transform: rotate(-90deg);
animation: spin var(--speed) ease-in-out infinite;
}
}
@keyframes spin {
0% {
stroke-dashoffset: 625;
transform: rotate(-90deg) scaleY(1);
}
50% {
/* 关键2:该属性是实现延迟多久出现,这里设置不延迟就充满整个圆 */
stroke-dashoffset: 0; // [!code highlight]
/* 关键1:scaleY(-1)按照Y轴翻转,不要旋转哈 */
transform: rotate(-90deg) scaleY(1); // [!code highlight]
}
50.001% {
stroke-dashoffset: 0;
transform: rotate(-90deg) scaleY(-1);
}
100% {
stroke-dashoffset: 625;
transform: rotate(-90deg) scaleY(-1);
}
}
分享给其他人
如果该文章对您有帮助,欢迎分享给其他人阅读!
复制链接

评论区

图片
犟哟
Hello, I'm Juyial.
公告
欢迎来到我的博客,在这里可以一起进步,一起学习!2026年起航!
分类
站点统计
文章
19
分类
1
标签
3
总字数
35,134
运行时长
0
最后活动
0 天前

目录