用途:为图标、插画、Logo、数据标记等矢量图形添加轻量、可无限缩放的动画,适用于描边“自己画出”、形状/路径变形与图标状态切换(菜单↔关闭、播放↔暂停)、元素沿路径运动、渐变与滤镜(发光、位移)动画及动态 Logo。
实现方式:CSS(声明式、简单)、SMIL(SVG 内部 <animate>,自包含、无需 JS)、JS(GSAP/Web Animations,便于控制与变形)。
核心技巧:描边绘制把 dasharray 设为路径长度、dashoffset 设为同值再动画到 0;长度可用 JS getTotalLength 获取,或用 pathLength="1" 归一化免测量;反向擦除则从 0 动画回长度,多个路径可用 animation-delay 错开。路径变形要求两条 d 命令结构一致,否则可用 GSAP MorphSVG 或 Flubber。沿路径运动可用 GSAP MotionPath、SMIL animateMotion 或 CSS offset-path。渐变可动画 gradientTransform 或 stop 偏移;滤镜动画 feDisplacementMap、feGaussianBlur 等,但滤镜较重,优先 transform/opacity。
限制与注意:SMIL 不支持 IE/旧 Edge,历史上有弃用标记,最大兼容或需滚动同步时优先 CSS 或 JS。SVG 需内联到 DOM 才能被 CSS/JS 访问内部元素;设置 viewBox 并避免固定宽高。SVGO 优化时保留 viewBox、禁用 cleanupIds、removeViewBox、mergePaths、convertShapeToPath 等会破坏动画引用的插件。描边绘制要求路径是真实描边(fill:none)。应尊重 prefers-reduced-motion,保留静态最终状态。
交付与验证:产物为一个可直接在浏览器打开的 HTML 文件,内联 SVG,只用一种动画驱动,无需构建步骤;包含 ?t=N 定格机制,配套脚本 scripts/seek-shot.sh anim.html 0 1.5 3 与 scripts/contact-sheet.sh 可截图或多帧拼接;可用 npx playwright screenshot 在起始、中段、结束逐帧检查方向、变形端点、裁剪与抖动。