以下是修复了脚与脚踏同步问题的完整 HTML 代码。核心修复是将鹈鹕的小腿和脚蹼移入曲柄旋转组,随脚踏同步转动,大腿留在身体弹跳组内并增加跟随摆动的动画,实现自然的踩踏衔接。
```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>骑自行车的鹈鹕 · 循环动画</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background: #1a1a2e;
font-family: system-ui, sans-serif;
}
.wrapper {
width: 100%;
max-width: 820px;
padding: 20px;
background: #16213e;
border-radius: 24px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
}
.header {
text-align: center;
padding: 0 0 16px 0;
}
.header h1 {
color: #FFCC02;
font-size: 1.4rem;
font-weight: 700;
letter-spacing: 0.04em;
margin: 0 0 4px 0;
}
.header p {
color: #8899aa;
font-size: 0.85rem;
margin: 0;
}
svg {
display: block;
width: 100%;
height: auto;
border-radius: 16px;
}
.badge {
display: inline-block;
font-size: 0.7rem;
background: #FFCC02;
color: #1a1a2e;
padding: 3px 10px;
border-radius: 20px;
font-weight: 700;
letter-spacing: 0.06em;
margin-bottom: 8px;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="header">
<span class="badge">LOOP ANIMATION</span>
<h1>🚴 鹈鹕骑自行车</h1>
<p>脚踏·曲柄·小腿·脚蹼 — 全同步旋转</p>
</div>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600">
<defs>
<!-- 天空渐变 -->
<linearGradient id="skyGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="#87CEEB" stop-opacity="1" />
<stop offset="60%" stop-color="#B8E4F0" stop-opacity="1" />
<stop offset="100%" stop-color="#E8F8E0" stop-opacity="1" />
</linearGradient>
<!-- 太阳渐变 -->
<radialGradient id="sunGrad" cx="35%" cy="35%">
<stop offset="0%" stop-color="#FFF9C4" stop-opacity="1" />
<stop offset="100%" stop-color="#FFB300" stop-opacity="1" />
</radialGradient>
<!-- 鹈鹕身体 -->
<radialGradient id="pelicanBody" cx="50%" cy="40%">
<stop offset="0%" stop-color="#FFFFFF" stop-opacity="1" />
<stop offset="70%" stop-color="#F5F5F5" stop-opacity="1" />
<stop offset="100%" stop-color="#E0E0E0" stop-opacity="1" />
</radialGradient>
<!-- 喙 -->
<linearGradient id="beakGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#FFCC02" stop-opacity="1" />
<stop offset="100%" stop-color="#F57C00" stop-opacity="1" />
</linearGradient>
<!-- 喉囊 -->
<linearGradient id="pouchGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="#FFE082" stop-opacity="0.9" />
<stop offset="100%" stop-color="#FFB74D" stop-opacity="0.65" />
</linearGradient>
<!-- 车轮 -->
<radialGradient id="wheelGrad" cx="45%" cy="40%">
<stop offset="0%" stop-color="#666" stop-opacity="1" />
<stop offset="60%" stop-color="#333" stop-opacity="1" />
<stop offset="100%" stop-color="#1a1a1a" stop-opacity="1" />
</radialGradient>
<!-- 地面 -->
<linearGradient id="groundGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="#7CB342" stop-opacity="1" />
<stop offset="100%" stop-color="#558B2F" stop-opacity="1" />
</linearGradient>
<!-- 阴影滤镜 -->
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="3" dy="5" stdDeviation="4" flood-color="#00000033" />
</filter>
</defs>
<style>
/* ── 冠羽飘动 ── */
@keyframes crestSway {
0%,
100% {
transform: rotate(-3deg);
}
50% {
transform: rotate(5deg);
}
}
.crest {
transform-origin: 300px 115px;
animation: crestSway 1.8s ease-in-out infinite;
}
/* ── 尾巴摆动 ── */
@keyframes tailWag {
0%,
100% {
transform: rotate(0deg);
}
25% {
transform: rotate(4deg);
}
75% {
transform: rotate(-5deg);
}
}
.tail-feathers {
transform-origin: 330px 330px;
animation: tailWag 1.2s ease-in-out infinite;
}
/* ── 蝴蝶飞舞 ── */
@keyframes fly {
0%,
100% {
transform: translate(0, 0) rotate(0deg);
}
20% {
transform: translate(18px, -22px) rotate(6deg);
}
40% {
transform: translate(35px, -8px) rotate(-4deg);
}
60% {
transform: translate(22px, -28px) rotate(10deg);
}
80% {
transform: translate(8px, -15px) rotate(-2deg);
}
}
.butterfly-group {
animation: fly 5s ease-in-out infinite;
}
</style>
<!-- 背景天空 -->
<rect x="0" y="0" width="800" height="600" fill="url(#skyGrad)" />
<!-- 太阳 + 脉动 -->
<circle cx="680" cy="100" r="55" fill="url(#sunGrad)" opacity="0.9">
<animate attributeName="r" values="55;58;55" dur="4s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.5;1" keySplines="0.4 0 0.6 1;0.4 0 0.6 1" />
</circle>
<!-- 太阳旋转光线 -->
<g opacity="0.25" stroke="#FFB300" stroke-width="3" stroke-linecap="round">
<animateTransform attributeName="transform" type="rotate"
from="0 680 100" to="360 680 100" dur="12s" repeatCount="indefinite" />
<line x1="680" y1="30" x2="680" y2="15" />
<line x1="680" y1="170" x2="680" y2="185" />
<line x1="610" y1="100" x2="595" y2="100" />
<line x1="750" y1="100" x2="765" y2="100" />
<line x1="630" y1="50" x2="620" y2="40" />
<line x1="730" y1="150" x2="740" y2="160" />
<line x1="730" y1="50" x2="740" y2="40" />
<line x1="630" y1="150" x2="620" y2="160" />
</g>
<!-- 云朵1 -->
<g>
<animateTransform attributeName="transform" type="translate"
values="0,0;40,0;0,0" dur="18s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.5;1" keySplines="0.4 0 0.6 1;0.4 0 0.6 1" />
<ellipse cx="150" cy="90" rx="60" ry="25" fill="white" opacity="0.6" />
<ellipse cx="190" cy="80" rx="40" ry="20" fill="white" opacity="0.6" />
<ellipse cx="120" cy="85" rx="35" ry="18" fill="white" opacity="0.6" />
<ellipse cx="155" cy="75" rx="30" ry="16" fill="white" opacity="0.6" />
</g>
<!-- 云朵2 -->
<g>
<animateTransform attributeName="transform" type="translate"
values="0,0;-35,0;0,0" dur="22s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.5;1" keySplines="0.4 0 0.6 1;0.4 0 0.6 1"
begin="5s" />
<ellipse cx="500" cy="70" rx="45" ry="18" fill="white" opacity="0.4" />
<ellipse cx="530" cy="62" rx="30" ry="15" fill="white" opacity="0.4" />
<ellipse cx="475" cy="65" rx="28" ry="13" fill="white" opacity="0.4" />
</g>
<!-- 地面 -->
<ellipse cx="400" cy="530" rx="420" ry="90" fill="url(#groundGrad)" opacity="0.8" />
<rect x="0" y="520" width="800" height="80" fill="#7CB342" opacity="0.7" />
<!-- 自行车阴影(脉动) -->
<ellipse cx="380" cy="515" rx="160" ry="12" fill="#00000022">
<animate attributeName="rx" values="160;155;160" dur="0.6s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.5;1" keySplines="0.4 0 0.6 1;0.4 0 0.6 1" />
<animate attributeName="opacity" values="0.15;0.25;0.15" dur="0.6s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.5;1" keySplines="0.4 0 0.6 1;0.4 0 0.6 1" />
</ellipse>
<!-- ============================================ -->
<!-- 自行车静态结构(不旋转的部分) -->
<!-- ============================================ -->
<g filter="url(#shadow)">
<!-- 后轮外圈 -->
<circle cx="220" cy="460" r="55" fill="none" stroke="#333" stroke-width="6" />
<circle cx="220" cy="460" r="55" fill="url(#wheelGrad)" opacity="0.15" />
<!-- 前轮外圈 -->
<circle cx="530" cy="460" r="55" fill="none" stroke="#333" stroke-width="6" />
<circle cx="530" cy="460" r="55" fill="url(#wheelGrad)" opacity="0.15" />
<!-- 车架三角 -->
<g stroke="#E53935" stroke-width="7" stroke-linecap="round" stroke-linejoin="round">
<line x1="220" y1="460" x2="360" y2="430" />
<line x1="220" y1="460" x2="310" y2="360" />
<line x1="360" y1="430" x2="310" y2="360" />
<line x1="310" y1="360" x2="490" y2="380" />
<line x1="360" y1="430" x2="490" y2="380" />
</g>
<!-- 头管 + 前叉 -->
<line x1="490" y1="380" x2="520" y2="340" stroke="#757575" stroke-width="8" stroke-linecap="round" />
<path d="M520 340 Q525 400 530 460" fill="none" stroke="#757575" stroke-width="6" stroke-linecap="round" />
<!-- 车把 -->
<path d="M500 330 Q510 320 540 325 Q550 327 555 335" fill="none" stroke="#333" stroke-width="6"
stroke-linecap="round" />
<line x1="540" y1="323" x2="558" y2="336" stroke="#FFCC02" stroke-width="9" stroke-linecap="round"
opacity="0.8" />
<line x1="498" y1="328" x2="493" y2="322" stroke="#FFCC02" stroke-width="9" stroke-linecap="round"
opacity="0.8" />
<!-- 座管 -->
<line x1="310" y1="348" x2="310" y2="360" stroke="#555" stroke-width="6" stroke-linecap="round" />
</g>
<!-- ============================================ -->
<!-- 后轮旋转组 -->
<!-- ============================================ -->
<g>
<animateTransform attributeName="transform" type="rotate"
from="0 220 460" to="-360 220 460" dur="1.2s" repeatCount="indefinite" />
<g stroke="#777" stroke-width="1.5" opacity="0.6">
<line x1="220" y1="405" x2="220" y2="515" />
<line x1="165" y1="460" x2="275" y2="460" />
<line x1="181" y1="421" x2="259" y2="499" />
<line x1="259" y1="421" x2="181" y2="499" />
<line x1="174" y1="441" x2="266" y2="479" />
<line x1="266" y1="441" x2="174" y2="479" />
<line x1="192" y1="410" x2="248" y2="510" />
<line x1="248" y1="410" x2="192" y2="510" />
</g>
<circle cx="220" cy="460" r="8" fill="#555" />
<circle cx="220" cy="460" r="4" fill="#FFCC02" />
</g>
<!-- ============================================ -->
<!-- 前轮旋转组 -->
<!-- ============================================ -->
<g>
<animateTransform attributeName="transform" type="rotate"
from="0 530 460" to="-360 530 460" dur="1.2s" repeatCount="indefinite" />
<g stroke="#777" stroke-width="1.5" opacity="0.6">
<line x1="530" y1="405" x2="530" y2="515" />
<line x1="475" y1="460" x2="585" y2="460" />
<line x1="491" y1="421" x2="569" y2="499" />
<line x1="569" y1="421" x2="491" y2="499" />
<line x1="484" y1="441" x2="576" y2="479" />
<line x1="576" y1="441" x2="484" y2="479" />
<line x1="502" y1="410" x2="558" y2="510" />
<line x1="558" y1="410" x2="502" y2="510" />
</g>
<circle cx="530" cy="460" r="8" fill="#555" />
<circle cx="530" cy="460" r="4" fill="#FFCC02" />
</g>
<!-- ============================================ -->
<!-- ★ 曲柄 + 脚踏 + 小腿 + 脚蹼 全同步旋转组 ★ -->
<!-- 旋转中心: (360, 430) — 中轴位置 -->
<!-- 所有偏移量相对于 (360, 430) -->
<!-- ============================================ -->
<g>
<animateTransform attributeName="transform" type="rotate"
from="0 360 430" to="-360 360 430" dur="1.2s" repeatCount="indefinite" />
<!-- ── 链轮 ── -->
<circle cx="360" cy="430" r="14" fill="#555" />
<circle cx="360" cy="430" r="7" fill="#FFCC02" />
<g fill="#444">
<rect x="357" y="414" width="6" height="4" rx="1" />
<rect x="357" y="442" width="6" height="4" rx="1" />
<rect x="344" y="427" width="4" height="6" rx="1" />
<rect x="372" y="427" width="4" height="6" rx="1" />
<rect x="347" y="418" width="4" height="4" rx="1" />
<rect x="369" y="418" width="4" height="4" rx="1" />
<rect x="347" y="438" width="4" height="4" rx="1" />
<rect x="369" y="438" width="4" height="4" rx="1" />
</g>
<!-- ── 右曲柄臂:(0,0)→(-14, 22) ── -->
<line x1="360" y1="430" x2="346" y2="452" stroke="#444" stroke-width="5" stroke-linecap="round" />
<!-- ── 左曲柄臂:(0,0)→(14, -22) ── -->
<line x1="360" y1="430" x2="374" y2="408" stroke="#444" stroke-width="5" stroke-linecap="round" />
<!-- ── 右脚踏板 ── -->
<rect x="330" y="448" width="20" height="8" rx="3" fill="#555" stroke="#333" stroke-width="1.2" />
<!-- ── 左脚踏板 ── -->
<rect x="364" y="400" width="20" height="8" rx="3" fill="#555" stroke="#333" stroke-width="1.2" />
<!-- ── ★ 右小腿(膝盖→脚踝→脚踏) ── -->
<!-- 膝盖在 (-31, 2),脚踝在 (-18, 15),脚踏在 (-14, 22) -->
<circle cx="329" cy="432" r="4.5" fill="#E8A020" stroke="#CC8000" stroke-width="1.2" />
<path d="M329,432 L342,445 L346,452" fill="none" stroke="#F5A623" stroke-width="5.5"
stroke-linecap="round" stroke-linejoin="round" />
<!-- 右脚蹼(站在右脚踏上) -->
<g fill="#F5A623" stroke="#E0951A" stroke-width="0.8">
<path d="M338,451 L331,459 L336,453 L330,462 L340,455 L334,465 L344,456Z" />
</g>
<!-- ── ★ 左小腿(膝盖→脚踝→脚踏) ── -->
<!-- 膝盖在 (31, -2),脚踝在 (18, -15),脚踏在 (14, -22) -->
<circle cx="391" cy="428" r="4.5" fill="#D89018" stroke="#B87000" stroke-width="1.2" />
<path d="M391,428 L378,415 L374,408" fill="none" stroke="#E0951A" stroke-width="5"
stroke-linecap="round" stroke-linejoin="round" />
<!-- 左脚蹼(站在左脚踏上) -->
<g fill="#E0951A" stroke="#C88015" stroke-width="0.8">
<path d="M382,405 L375,413 L380,408 L374,416 L384,410 L378,419 L386,411Z" />
</g>
</g>
<!-- ============================================ -->
<!-- 鹈鹕身体弹跳组(大腿跟随摆动) -->
<!-- ============================================ -->
<g filter="url(#shadow)">
<animateTransform attributeName="transform" type="translate"
values="0,0; 0,-7; 0,0; 0,-5; 0,0" dur="0.6s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.2;0.5;0.75;1"
keySplines="0.4 0 0.6 1;0.4 0 0.6 1;0.3 0 0.7 1;0.4 0 0.6 1" />
<!-- ── 身体 ── -->
<ellipse cx="295" cy="295" rx="52" ry="58" fill="url(#pelicanBody)"
transform="rotate(-5,295,295)" />
<!-- 腹部羽毛纹理 -->
<g opacity="0.15" fill="none" stroke="#999" stroke-width="1.5">
<path d="M260 300 Q275 310 270 330" />
<path d="M280 295 Q295 308 290 335" />
<path d="M300 293 Q315 305 310 332" />
<path d="M320 295 Q335 308 328 328" />
</g>
<!-- 尾巴羽毛 -->
<g class="tail-feathers" fill="#E0E0E0" stroke="#CCC" stroke-width="1">
<path d="M335 330 Q360 340 370 360 Q355 345 340 340Z" />
<path d="M330 318 Q355 328 368 348 Q350 332 335 328Z" />
<path d="M340 340 Q365 355 375 370 Q358 358 345 350Z" />
</g>
<!-- 翅膀 -->
<path d="M310 270 Q370 250 430 280 Q470 300 510 320 Q470 290 430 275 Q380 260 320 280Z"
fill="#E8E8E8" stroke="#CCC" stroke-width="1.5" />
<g fill="#D0D0D0" stroke="#BBB" stroke-width="1">
<path d="M500 318 Q515 315 520 325 Q512 320 505 322Z" />
<path d="M495 312 Q510 308 518 318 Q508 314 500 316Z" />
</g>
<!-- 脖子 + 头部 -->
<path d="M270 270 Q260 230 268 190 Q275 165 290 155"
fill="#F5F5F5" stroke="#E0E0E0" stroke-width="2" />
<path d="M280 265 Q272 225 278 185 Q285 160 300 150" fill="#FFFFFF" stroke="none" />
<ellipse cx="300" cy="145" rx="35" ry="32" fill="#FAFAFA" stroke="#E0E0E0" stroke-width="1.5" />
<!-- 冠羽 -->
<g class="crest" fill="#F0F0F0" stroke="#DDD" stroke-width="0.8">
<path d="M310 115 Q315 98 325 92 Q318 100 312 115Z" />
<path d="M300 112 Q305 93 312 85 Q307 97 302 114Z" />
<path d="M290 118 Q292 100 298 90 Q294 103 288 120Z" />
</g>
<!-- 眼睛(含眨眼) -->
<circle cx="310" cy="138" r="8" fill="white" stroke="#CCC" stroke-width="1" />
<circle cx="312" cy="137" r="4" fill="#222">
<animate attributeName="ry" values="4;4;0.5;4;4"
keyTimes="0;0.06;0.1;0.16;1" dur="4s" repeatCount="indefinite" begin="1.5s" />
</circle>
<circle cx="314" cy="135" r="1.5" fill="white">
<animate attributeName="cy" values="135;135;136;135;135"
keyTimes="0;0.06;0.1;0.16;1" dur="4s" repeatCount="indefinite" begin="1.5s" />
</circle>
<path d="M303 128 Q310 124 320 127" fill="none" stroke="#999"
stroke-width="1.5" stroke-linecap="round" />
<!-- 喙(上喙) -->
<path d="M330 140 Q360 138 395 142 Q410 144 415 148 Q400 144 370 146 Q340 148 330 148Z"
fill="url(#beakGrad)" stroke="#E65100" stroke-width="1" />
<path d="M412 146 Q418 148 416 152 Q412 150 410 148Z" fill="#F57C00" />
<line x1="332" y1="143" x2="410" y2="147" stroke="#E65100" stroke-width="0.8" opacity="0.5" />
<!-- 喉囊(呼吸摆动) -->
<path fill="url(#pouchGrad)" stroke="#CC8800" stroke-width="0.8">
<animate attributeName="d"
values="M330 148 Q340 165 355 175 Q370 180 390 172 Q400 166 405 155 Q400 165 385 170 Q365 174 350 165 Q338 155 330 148Z;
M330 148 Q340 170 355 180 Q370 186 390 177 Q400 170 405 157 Q400 170 385 176 Q365 180 350 169 Q338 159 330 148Z;
M330 148 Q340 165 355 175 Q370 180 390 172 Q400 166 405 155 Q400 165 385 170 Q365 174 350 165 Q338 155 330 148Z"
dur="1.5s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.5;1"
keySplines="0.4 0 0.6 1;0.4 0 0.6 1" />
</path>
<g stroke="#CC8800" stroke-width="0.5" opacity="0.4" fill="none">
<path d="M340 153 Q350 162 345 168" />
<path d="M355 155 Q362 163 358 170" />
<path d="M370 154 Q376 160 373 168" />
<path d="M385 152 Q390 157 388 164" />
</g>
<!-- ── ★ 右大腿(臀部→膝盖方向,带摆动) ── -->
<!-- 臀部约在 (285, 342),膝盖方向约在 (318, 400) -->
<g>
<animateTransform attributeName="transform" type="rotate"
values="-10 285 342; 15 285 342; -10 285 342"
dur="1.2s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.5;1"
keySplines="0.4 0 0.6 1;0.4 0 0.6 1" />
<path d="M285,342 L318,400" fill="none" stroke="#F5A623"
stroke-width="6" stroke-linecap="round" />
<!-- 大腿羽毛点缀 -->
<ellipse cx="300" cy="370" rx="8" ry="5" fill="#F5A623" opacity="0.15" />
</g>
<!-- ── ★ 左大腿(臀部→膝盖方向,带摆动) ── -->
<g>
<animateTransform attributeName="transform" type="rotate"
values="-10 275 345; 15 275 345; -10 275 345"
dur="1.2s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.5;1"
keySplines="0.4 0 0.6 1;0.4 0 0.6 1" />
<path d="M275,345 L305,388" fill="none" stroke="#E0951A"
stroke-width="5" stroke-linecap="round" />
</g>
</g>
<!-- 车座(同步弹跳) -->
<ellipse cx="310" cy="348" rx="28" ry="8" fill="#333" transform="rotate(-8,310,348)">
<animateTransform attributeName="transform" type="translate"
values="0,0; 0,-7; 0,0; 0,-5; 0,0" dur="0.6s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.2;0.5;0.75;1"
keySplines="0.4 0 0.6 1;0.4 0 0.6 1;0.3 0 0.7 1;0.4 0 0.6 1"
additive="sum" />
</ellipse>
<!-- ============================================ -->
<!-- 速度线 -->
<!-- ============================================ -->
<g stroke="#90CAF9" stroke-width="2" stroke-linecap="round">
<line x1="560" y1="300" x2="610" y2="298">
<animate attributeName="x2" values="610;630;610" dur="0.6s" repeatCount="indefinite" />
<animate attributeName="opacity" values="0.3;0.6;0.3" dur="0.6s" repeatCount="indefinite" />
</line>
<line x1="555" y1="320" x2="620" y2="316">
<animate attributeName="x2" values="620;645;620" dur="0.7s" repeatCount="indefinite" begin="0.15s" />
<animate attributeName="opacity" values="0.25;0.55;0.25" dur="0.7s" repeatCount="indefinite"
begin="0.15s" />
</line>
<line x1="565" y1="340" x2="600" y2="338">
<animate attributeName="x2" values="600;625;600" dur="0.5s" repeatCount="indefinite" begin="0.3s" />
<animate attributeName="opacity" values="0.35;0.65;0.35" dur="0.5s" repeatCount="indefinite"
begin="0.3s" />
</line>
<line x1="558" y1="360" x2="615" y2="357">
<animate attributeName="x2" values="615;638;615" dur="0.65s" repeatCount="indefinite" begin="0.1s" />
<animate attributeName="opacity" values="0.2;0.5;0.2" dur="0.65s" repeatCount="indefinite"
begin="0.1s" />
</line>
</g>
<!-- ============================================ -->
<!-- 音符浮动 -->
<!-- ============================================ -->
<g fill="#FF7043">
<text x="430" y="120" font-size="18" font-family="serif" opacity="0">♪
<animate attributeName="opacity" values="0;0.8;0.8;0" dur="3s" repeatCount="indefinite" />
<animateTransform attributeName="transform" type="translate"
values="0,0;5,-18;10,-30" dur="3s" repeatCount="indefinite" />
</text>
<text x="445" y="100" font-size="14" font-family="serif" opacity="0">♫
<animate attributeName="opacity" values="0;0;0.7;0.7;0" dur="3.2s" repeatCount="indefinite"
begin="0.6s" />
<animateTransform attributeName="transform" type="translate"
values="0,0;5,-15;10,-28" dur="3.2s" repeatCount="indefinite" begin="0.6s" />
</text>
<text x="460" y="128" font-size="12" font-family="serif" opacity="0">♪
<animate attributeName="opacity" values="0;0;0.6;0.6;0" dur="2.8s" repeatCount="indefinite"
begin="1.2s" />
<animateTransform attributeName="transform" type="translate"
values="0,0;4,-12;8,-22" dur="2.8s" repeatCount="indefinite" begin="1.2s" />
</text>
</g>
<!-- ============================================ -->
<!-- 尘土粒子(后轮扬起) -->
<!-- ============================================ -->
<circle cx="220" cy="510" r="3" fill="#C8A96E" opacity="0">
<animate attributeName="cy" values="510;488;465" dur="0.9s" repeatCount="indefinite" begin="0s" />
<animate attributeName="cx" values="220;212;200" dur="0.9s" repeatCount="indefinite" begin="0s" />
<animate attributeName="opacity" values="0;0.6;0" dur="0.9s" repeatCount="indefinite" begin="0s" />
<animate attributeName="r" values="3;2;0.5" dur="0.9s" repeatCount="indefinite" begin="0s" />
</circle>
<circle cx="225" cy="512" r="2.5" fill="#C8A96E" opacity="0">
<animate attributeName="cy" values="512;490;468" dur="0.8s" repeatCount="indefinite" begin="0.35s" />
<animate attributeName="cx" values="225;218;208" dur="0.8s" repeatCount="indefinite" begin="0.35s" />
<animate attributeName="opacity" values="0;0.5;0" dur="0.8s" repeatCount="indefinite" begin="0.35s" />
<animate attributeName="r" values="2.5;1.5;0.5" dur="0.8s" repeatCount="indefinite" begin="0.35s" />
</circle>
<circle cx="218" cy="511" r="2" fill="#BDA070" opacity="0">
<animate attributeName="cy" values="511;492;472" dur="0.75s" repeatCount="indefinite" begin="0.6s" />
<animate attributeName="cx" values="218;210;198" dur="0.75s" repeatCount="indefinite" begin="0.6s" />
<animate attributeName="opacity" values="0;0.45;0" dur="0.75s" repeatCount="indefinite" begin="0.6s" />
<animate attributeName="r" values="2;1.5;0.5" dur="0.75s" repeatCount="indefinite" begin="0.6s" />
</circle>
<!-- ============================================ -->
<!-- 地面小草(摇曳) -->
<!-- ============================================ -->
<g>
<animateTransform attributeName="transform" type="rotate"
values="-6 60 520;6 60 520;-6 60 520" dur="2.2s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.5;1" keySplines="0.4 0 0.6 1;0.4 0 0.6 1" />
<path d="M60 520 Q63 505 58 490" fill="none" stroke="#66BB6A" stroke-width="2.5" stroke-linecap="round"
opacity="0.6" />
<path d="M65 520 Q70 508 68 492" fill="none" stroke="#66BB6A" stroke-width="2.5" stroke-linecap="round"
opacity="0.6" />
</g>
<g>
<animateTransform attributeName="transform" type="rotate"
values="4 100 518;-5 100 518;4 100 518" dur="2.5s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.5;1" keySplines="0.4 0 0.6 1;0.4 0 0.6 1" begin="0.3s" />
<path d="M100 518 Q98 503 103 488" fill="none" stroke="#66BB6A" stroke-width="2.5" stroke-linecap="round"
opacity="0.6" />
<path d="M105 518 Q110 506 107 492" fill="none" stroke="#66BB6A" stroke-width="2.5" stroke-linecap="round"
opacity="0.6" />
</g>
<g>
<animateTransform attributeName="transform" type="rotate"
values="-3 600 520;7 600 520;-3 600 520" dur="1.9s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.5;1" keySplines="0.4 0 0.6 1;0.4 0 0.6 1" begin="0.7s" />
<path d="M600 520 Q598 502 603 488" fill="none" stroke="#66BB6A" stroke-width="2.5" stroke-linecap="round"
opacity="0.6" />
<path d="M608 520 Q612 508 610 494" fill="none" stroke="#66BB6A" stroke-width="2.5" stroke-linecap="round"
opacity="0.6" />
</g>
<g>
<animateTransform attributeName="transform" type="rotate"
values="5 680 518;-4 680 518;5 680 518" dur="2.0s" repeatCount="indefinite"
calcMode="spline" keyTimes="0;0.5;1" keySplines="0.4 0 0.6 1;0.4 0 0.6 1" begin="0.5s" />
<path d="M680 518 Q678 504 682 490" fill="none" stroke="#66BB6A" stroke-width="2.5" stroke-linecap="round"
opacity="0.6" />
<path d="M685 518 Q690 506 688 492" fill="none" stroke="#66BB6A" stroke-width="2.5" stroke-linecap="round"
opacity="0.6" />
</g>
<!-- ============================================ -->
<!-- 蝴蝶 -->
<!-- ============================================ -->
<g class="butterfly-group" opacity="0.55">
<ellipse cx="-4" cy="0" rx="5" ry="3.5" fill="#CE93D8" transform="rotate(-25)">
<animate attributeName="ry" values="3.5;2;3.5" dur="0.25s" repeatCount="indefinite" />
</ellipse>
<ellipse cx="4" cy="0" rx="5" ry="3.5" fill="#CE93D8" transform="rotate(25)">
<animate attributeName="ry" values="3.5;2;3.5" dur="0.25s" repeatCount="indefinite" begin="0.125s" />
</ellipse>
<line x1="0" y1="-1" x2="0" y2="1.5" stroke="#7B1FA2" stroke-width="0.8" />
</g>
</svg>
</div>
</body>
</html>
```
**修复要点:**
| 问题 | 修复方案 |
|------|----------|
| 脚与脚踏错位 | 将小腿+脚蹼移入曲柄旋转组,与脚踏共享 `(360,430)` 旋转中心,1.2s 同期旋转 |
| 膝盖连接断裂 | 大腿留在身体弹跳组,增加 `animateTransform` 旋转动画(±10°~15°),跟随曲柄节奏摆动 |
| 视觉衔接 | 大腿端点指向膝盖旋转轨迹方向,膝盖球关节(橙色圆点)作为视觉桥梁 |