尝试弄清楚 CSS 和 SVG 动画如何交互。为此,我采用了最简单的场景:
- 角色从右向左移动,同时上下移动(svg)
- 旋转 180 度 (css) 并
- 向后移动至左右 (css)
以下是代码:
body { perspective: 1000px;}
.container{
width:80vw;
height:80vh;
}
#SnowMaiden {
transform-box:fill-box;
transform-origin: center center;
animation: Maiden_rotate 2s linear 8s forwards, Maiden_translate 14s linear 16s forwards;
}
@keyframes Maiden_rotate {
0%{ transform: rotate3d(0,1,0,20deg);}
50%{ transform: rotate3d(0,1,0,80deg);}
100%{ transform: rotate3d(0,1,0,180deg);}
}
@keyframes Maiden_translate {
0%{ transform: translate3d(300px,10px,10px);}
50%{ transform: translate3d(800px,10px,10px);}
100%{ transform: translate3d(1400px,10px,10px);}
}
<svg id="svg1" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 1680 1050" preserveAspectRatio="xMinYMin meet" >
<!-- Фон с ёлочкой -->
<image id="img1" xlink:href="https://isstatic.askoverflow.dev/PBRad.jpg" width="100%" height="100%" opacity="1" />
<image id="SnowMaiden" x="1400" y="650" xlink:href="https://isstatic.askoverflow.dev/LU3Bvfdr.png" opacity="0">
<!-- Анимация появления девочки с корзинкой -->
<animate id="op1_Maidan" attributeName="opacity" values="0; 1" dur="2s" begin="svg1.click" repeatCount="1" fill="freeze" restart="whenNotActive" />
<!-- Перемещение по горизонтали -->
<animate id="Go_Maidan" attributeName="x" values="1400;1300;1200;1100;1000;900;800;700;600;500;400;300" dur="5s" begin="op1_Maidan.end" repeatCount="indefinity" fill="freeze" restart="whenNotActive" />
<!-- Перемещение по вертикали -->
<animate id="Go_Maidan_y" attributeName="y" values="650;670;650;630;650;670;650;630;650;670;650;630" dur="5s" begin="op1_Maidan.end" repeatCount="indefinity" fill="freeze" restart="whenNotActive" />
</image>
</svg>
从代码片段的结果可以看出:
180 度旋转之前的 SVG 动画阶段一切正常。故障在转弯后开始。看起来 CSS 动画与之前的 SVG 动画冲突,这就是 CSS 运动结果不可见的原因。
当然,您可以纯粹用 SVG 或仅使用 CSS 来实现动画。
我有一个问题,如何让 SVG 和 CSS 动画正确协同工作?