【发布时间】:2020-12-26 20:04:03
【问题描述】:
正如标题所说,我正在尝试为 svg 设置动画,使其看起来像省略号路径以匹配它 第一个图标(无穷大符号)。我试过使用变换,但动作很糟糕。我怎样才能以一种顺利(尽可能)的方式实现这一目标?
我发现了一些关于类似内容的文章,但它并没有让我得到我所追求的平滑省略号: https://www.useragentman.com/blog/2013/03/03/animating-circular-paths-using-css3-transitions/ http://thenewcode.com/860/Animating-Elements-In-Arcs-Circles-and-Ellipses-With-CSS https://usefulangle.com/post/32/moving-an-element-in-circular-path-with-css
这里是钢笔链接https://codepen.io/acubaniti/pen/abNqzEV?editors=1100
代码如下:
#gesture {
width: 300px;
height: 300px;
}
#phone {
fill: white;
animation: phone-orbits-cw 6s cubic-bezier(0.5, 0, 0.38, 0.1) infinite;
opacity: 0;
transform: rotate3d(0, 0, 0) translate3d(0, 0, 0);
will-change: transform, opacity;
transform-style: preserve-3d;
transform-origin: center top;
}
#left, #right {
fill: none;
stroke-width: 10;
stroke-miterlimit: 10;
stroke: white;
transform-origin: 200px 150px;
animation-fill-mode: forwards;
stroke-dasharray: 314;
stroke-dashoffset: 314;
opacity: 0;
}
#right {
animation: circle-fill 6s linear infinite;
stroke: white;
transform: rotate(-180deg);
}
#left {
animation: circle-fill-left 6s linear infinite;
stroke: white;
transform: rotateX(180deg);
}
@keyframes circle-fill {
0%, 12.5% {
stroke-dashoffset: 314;
opacity: 1;
}
12.5%, 100% {
stroke-dashoffset: 0;
}
37.5% {
opacity: 1;
}
49%, 100% {
opacity: 0;
}
}
@keyframes circle-fill-left {
12.5% {
stroke-dashoffset: 314;
opacity: 1;
}
25% {
stroke-dashoffset: 0;
}
37.5% {
opacity: 1;
}
49%, 100% {
opacity: 0;
stroke-dashoffset: 0;
}
}
@keyframes phone-orbits-cw {
0% {
opacity: 0;
transform: rotate3d(0, 0, 0) translate3d(0, 0, 0);
}
45% {
opacity: 0;
transform: rotate3d(0, 0, 1, -360deg) translate3d(2%, -5%, 0) rotate3d(0, 0, 1, 360deg);
}
58.75% {
opacity: 1;
transform: rotate3d(0, 0, 1, -360deg) translate3d(2%, -5%, 0) rotate3d(0, 0, 1, 360deg);
}
72.5% {
opacity: 1;
}
86.25% {
opacity: 1;
transform: rotate3d(0, 0, 1, 360deg) translate3d(-2%, -5%, 0) rotate3d(0, 0, 1, -360deg);
}
100% {
opacity: 1;
transform: rotate3d(0, 0, 1, -360deg) translate3d(0, 0, 0) rotate3d(0, 0, 1, 360deg);
}
}
@keyframes phone-orbits-ccw {
0% {
opacity: 0;
transform: rotate3d(0, 0, 0) translate3d(0, 0, 0);
}
40% {
opacity: 0;
transform: rotate3d(0, 0, 1, 180deg) translate3d(0, 0, 0) rotate3d(0, 0, 1, -180deg);
}
45% {
opacity: 1;
}
50% {
opacity: 1;
transform: rotate3d(0, 0, 1, -180deg) translate3d(2%, -5%, 0) rotate3d(0, 0, 1, 180deg);
}
75% {
opacity: 1;
}
100% {
opacity: 1;
transform: rotate3d(0, 0, 1, 180deg) translate3d(0, 0, 0) rotate3d(0, 0, 1, -180deg);
}
}
<html>
<body style="background-color: black;">
<svg id="gesture" viewBox="0 0 300 300" xml:space="preserve">
<g id="phone">
<path d="M212.1 23.1H90.2c-4.8 0-8.8 3.9-8.8 8.8v236.4c0 4.8 3.9 8.8 8.8 8.8h121.9c4.8 0 8.8-3.9 8.8-8.8V31.8c0-4.8-4-8.7-8.8-8.7zm0 8.5c.1 0 .2.1.2.2v28.4H90.2V31.6h121.9zM90 268.2l.2-200.6h122.1l-.2 200.8-122.1-.2z"/>
<circle cx="151.1" cy="248.2" r="8.8"/>
<path d="M142 49.5h18.3c2.3 0 4.1-1.8 4.1-4.1s-1.8-4.1-4.1-4.1H142c-2.3 0-4.1 1.8-4.1 4.1s1.8 4.1 4.1 4.1z"/>
</g>
<circle id="right" cx="200" cy="150" r="50"/>
<circle id="left" cx="100" cy="150" r="50"/>
</svg>
</body>
</html>
谢谢。
【问题讨论】:
-
堆栈片段不支持 SCSS。请发布编译后的 CSS。
-
谢谢,我不知道。
标签: css svg css-animations keyframe