You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内嵌CSS的SVG动画问题:面向观察者的缩放效果失效

问题修复与动画实现方案

修复后的完整代码

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1366 768">
  <defs>
    <style>
      .cls-1 {
        fill: #b3b3b3;
      }
      .cls-2 {
        fill: #ccc;
      }
      #fall1, #fall2, #fall3, #fall4 {
        animation-fill-mode: both;
        animation-name: fadeOutDown;
        animation-duration: 2s;
        /* 关键:设置变换原点为元素自身中心 */
        transform-origin: 50% 50%;
      }
      #fall1 { animation-delay: 1s; }
      #fall2 { animation-delay: 1.2s; }
      #fall3 { animation-delay: 1.4s; }
      #fall4 { animation-delay: 1.6s; }

      @keyframes fadeOutDown {
        0% {
          opacity: 1;
          transform: scale(1);
        }
        20% {
          opacity: 1;
          transform: scale(1.5);
        }
        100% {
          opacity: 0;
          /* 组合缩放与位移,避免覆盖之前的变换效果 */
          transform: scale(1.5) translate3d(0, 100%, 0);
        }
      }
    </style>
  </defs>
  <g id="fall1">
    <rect class="cls-1" x="433" y="104" width="118" height="118"/>
  </g>
  <g id="fall2">
    <rect class="cls-2" x="551" y="104" width="118" height="118"/>
  </g>
  <g id="fall3">
    <rect class="cls-1" x="669" y="104" width="118" height="118"/>
  </g>
  <g id="fall4">
    <rect class="cls-2" x="787" y="104" width="118" height="118"/>
  </g>
</svg>

核心问题解析与修复说明

  • 缩放偏移问题:
    你之前仅在20%关键帧中设置transform-origin,这会导致其他帧的变换原点回到SVG元素默认的左上角(0,0),从而出现偏移摆动。将transform-origin: 50% 50%移到目标元素的基础样式中,就能确保整个动画过程都以元素自身中心为变换基准。

  • 动画衔接问题:
    CSS的transform属性是覆盖式的,你之前在100%帧只写了translate3d,会完全覆盖之前的scale效果,导致缩放消失。需要将缩放和位移组合成一个transform声明,让元素在保持放大状态的同时向下移动,同时配合opacity实现淡出效果。

  • scale vs scale3d的选择:
    本次需求是2D平面的缩放效果,用scale(1.5)完全足够,代码更简洁。scale3d(1.5,1.5,1)虽然也能实现相同视觉效果,但属于3D变换,这里没有必要额外引入,除非你需要后续扩展Z轴相关的3D动画。

内容的提问来源于stack exchange,提问作者user379123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:50:38