【发布时间】:2020-01-06 13:19:15
【问题描述】:
Google 的 Material Design 微调器在旋转时会收缩和拉伸:
我在这里找到了以下 SVG 微调器,可以很好地实现它:https://codepen.io/svnt/pen/qraaRN。
HTML:
<svg class="spinner" viewBox="0 0 50 50"><circle class="path" cx="25" cy="25" r="20" fill="none" stroke-width="5"></circle></svg>
CSS:
/* SVG spinner icon animation */
.spinner {
-webkit-animation: rotate 2s linear infinite;
animation: rotate 2s linear infinite;
z-index: 2;
position: absolute;
top: 50%;
left: 50%;
margin: -25px 0 0 -25px;
width: 50px;
height: 50px;
}
.spinner .path {
stroke: #cccccc;
stroke-linecap: round;
-webkit-animation: dash 1.5s ease-in-out infinite;
animation: dash 1.5s ease-in-out infinite;
}
@-webkit-keyframes rotate {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes rotate {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-webkit-keyframes dash {
0% {
stroke-dasharray: 1, 150;
stroke-dashoffset: 0;
}
50% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -35;
}
100% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -124;
}
}
@keyframes dash {
0% {
stroke-dasharray: 1, 150;
stroke-dashoffset: 0;
}
50% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -35;
}
100% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -124;
}
}
问题是,@keyframes 动画使用 stroke-dasharray 和 stroke-dashoffset,它们似乎在主 UI 线程上运行,就好像我在动画运行时使用 JavaScript 执行一些任务一样,微调器失去了平滑度并变成生涩。
旋转(通过transform)效果很好,而且我知道它在 UI 线程之外运行,所以即使我执行一些 JS 任务,在动画时旋转也会很平滑。
当然,我可以在没有拉伸/收缩的情况下实现一个旋转微调器,但我想知道你们中是否有人知道如何让这样的动画看起来总是平滑的。有没有办法在旋转时使用transform 来拉伸和收缩微调器?
希望我很清楚。感谢关注!
【问题讨论】:
标签: javascript css svg css-animations spinner