billie-jean-dance 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +57 -0
- package/css/style.css +553 -0
- package/docs//345/256/211/350/243/205/350/257/264/346/230/216.txt +36 -0
- package/index.html +197 -0
- package/js/main.js +267 -0
- package/js/moves.js +289 -0
- package/js/skeleton.js +305 -0
- package/package.json +38 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kilganon725
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# BILLIE JEAN · 舞步拆解教学网站
|
|
2
|
+
|
|
3
|
+
用 **GSAP + ScrollTrigger** 制作的 Michael Jackson《Billie Jean》舞蹈教学单页网站。
|
|
4
|
+
火柴人骨骼由正向运动学(关节角度 → 坐标)驱动,GSAP 时间线逐帧驱动,可播放 / 暂停 / 调速,步骤讲解随动画自动高亮。
|
|
5
|
+
|
|
6
|
+
## 功能
|
|
7
|
+
|
|
8
|
+
- 🕴️ **8 大舞步拆解**:太空步、脚尖站立、侧滑、转身、侧踢、脚跟脚尖滑动、前倾 45°、抓帽甩帽
|
|
9
|
+
- 🎬 **GSAP 火柴人演示**:每个动作可 ▶ 播放 / ⏸ 暂停 / ↺ 重置 / 0.5×-1.5× 调速
|
|
10
|
+
- 📋 **分步教学**:拆解步骤随动画高亮 + 要点 + 常见错误 + 冷知识
|
|
11
|
+
- 🎵 **跟跳时间线**:副歌 8 拍连招,带 117 BPM 鼓点循环动画
|
|
12
|
+
- 🥁 **节拍器**:Web Audio 实现,60–140 BPM 可调(Billie Jean 原速 117)
|
|
13
|
+
- 📅 **7 天练习计划**
|
|
14
|
+
- ✨ 滚动动画、顶部进度条、导航高亮、移动端适配、`prefers-reduced-motion` 支持
|
|
15
|
+
|
|
16
|
+
## 文件结构
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
billie-jean-dance/
|
|
20
|
+
├── index.html # 页面骨架
|
|
21
|
+
├── css/style.css # 舞台风视觉
|
|
22
|
+
└── js/
|
|
23
|
+
├── skeleton.js # SVG 火柴人骨骼引擎(正向运动学 + 演示组件)
|
|
24
|
+
├── moves.js # 8 大舞步数据(关键帧 + 教学文案)
|
|
25
|
+
└── main.js # GSAP 编排(Hero/滚动/节拍器/时间线/计划)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 本地运行
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
cd billie-jean-dance
|
|
32
|
+
python3 -m http.server 8080
|
|
33
|
+
# 打开 http://127.0.0.1:8080
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
或直接双击 `index.html`(无构建步骤,纯静态)。
|
|
37
|
+
|
|
38
|
+
## npm 安装
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm install billie-jean-dance
|
|
42
|
+
cd node_modules/billie-jean-dance && npm start
|
|
43
|
+
# 打开 http://127.0.0.1:8734
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
详见 [docs/安装说明.txt](docs/安装说明.txt)。
|
|
47
|
+
|
|
48
|
+
## 技术栈
|
|
49
|
+
|
|
50
|
+
- [GSAP 3](https://gsap.com)(Tween / Timeline / ScrollTrigger / ScrollToPlugin,CDN 引入)
|
|
51
|
+
- 原生 JS + SVG,无构建工具
|
|
52
|
+
- Google Fonts:Anton(西文标题)+ Noto Sans SC(中文)
|
|
53
|
+
|
|
54
|
+
## 免责声明
|
|
55
|
+
|
|
56
|
+
本站为舞蹈爱好者致敬学习网站,与 Michael Jackson 官方无关。演示为简化示意,非专业舞蹈教学。
|
|
57
|
+
练习请量力而行,高风险动作(如前倾 45°)务必做好保护。
|
package/css/style.css
ADDED
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
* Billie Jean Dance — 舞台风视觉
|
|
3
|
+
* ============================================================ */
|
|
4
|
+
|
|
5
|
+
:root {
|
|
6
|
+
--bg: #07070b;
|
|
7
|
+
--bg2: #0c0c12;
|
|
8
|
+
--panel: #12121a;
|
|
9
|
+
--panel2: #171722;
|
|
10
|
+
--line: rgba(255, 255, 255, 0.08);
|
|
11
|
+
--ink: #f6f3ea;
|
|
12
|
+
--muted: #a8a29a;
|
|
13
|
+
--gold: #e8c25a;
|
|
14
|
+
--gold-soft: #f7e3a8;
|
|
15
|
+
--gold-deep: #b98f2f;
|
|
16
|
+
--red: #ff5c5c;
|
|
17
|
+
--font-display: 'Anton', 'Noto Sans SC', sans-serif;
|
|
18
|
+
--font-cn: 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
22
|
+
|
|
23
|
+
html { scroll-behavior: auto; }
|
|
24
|
+
|
|
25
|
+
body {
|
|
26
|
+
background: var(--bg);
|
|
27
|
+
color: var(--ink);
|
|
28
|
+
font-family: var(--font-cn);
|
|
29
|
+
line-height: 1.7;
|
|
30
|
+
overflow-x: hidden;
|
|
31
|
+
-webkit-font-smoothing: antialiased;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
::selection { background: var(--gold); color: #111; }
|
|
35
|
+
|
|
36
|
+
img, svg { display: block; }
|
|
37
|
+
|
|
38
|
+
a { color: inherit; text-decoration: none; }
|
|
39
|
+
|
|
40
|
+
button { font-family: inherit; cursor: pointer; }
|
|
41
|
+
|
|
42
|
+
/* ---------- 进度条 ---------- */
|
|
43
|
+
.progress {
|
|
44
|
+
position: fixed; top: 0; left: 0; right: 0; height: 3px;
|
|
45
|
+
background: linear-gradient(90deg, var(--gold-deep), var(--gold), var(--gold-soft));
|
|
46
|
+
transform-origin: 0 50%;
|
|
47
|
+
transform: scaleX(0);
|
|
48
|
+
z-index: 100;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* ---------- 导航 ---------- */
|
|
52
|
+
.nav {
|
|
53
|
+
position: fixed; top: 0; left: 0; right: 0; z-index: 90;
|
|
54
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
55
|
+
padding: 14px clamp(16px, 4vw, 40px);
|
|
56
|
+
background: linear-gradient(to bottom, rgba(7, 7, 11, 0.92), rgba(7, 7, 11, 0.55) 80%, transparent);
|
|
57
|
+
backdrop-filter: blur(6px);
|
|
58
|
+
border-bottom: 1px solid transparent;
|
|
59
|
+
}
|
|
60
|
+
.nav-brand {
|
|
61
|
+
font-family: var(--font-display);
|
|
62
|
+
font-size: 20px; letter-spacing: 2px;
|
|
63
|
+
}
|
|
64
|
+
.nav-brand span { color: var(--gold); }
|
|
65
|
+
.nav-links { display: flex; gap: clamp(12px, 2.4vw, 30px); }
|
|
66
|
+
.nav-links a {
|
|
67
|
+
font-size: 14px; color: var(--muted);
|
|
68
|
+
padding: 4px 2px; position: relative; transition: color 0.25s;
|
|
69
|
+
}
|
|
70
|
+
.nav-links a::after {
|
|
71
|
+
content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 2px;
|
|
72
|
+
background: var(--gold); transform: scaleX(0); transform-origin: left;
|
|
73
|
+
transition: transform 0.25s;
|
|
74
|
+
}
|
|
75
|
+
.nav-links a:hover, .nav-links a.is-active { color: var(--ink); }
|
|
76
|
+
.nav-links a:hover::after, .nav-links a.is-active::after { transform: scaleX(1); }
|
|
77
|
+
|
|
78
|
+
/* ---------- Hero ---------- */
|
|
79
|
+
.hero {
|
|
80
|
+
position: relative;
|
|
81
|
+
min-height: 100svh;
|
|
82
|
+
display: flex; flex-direction: column; align-items: center;
|
|
83
|
+
justify-content: center;
|
|
84
|
+
text-align: center;
|
|
85
|
+
padding: 90px 20px 0;
|
|
86
|
+
overflow: hidden;
|
|
87
|
+
background:
|
|
88
|
+
radial-gradient(ellipse 62% 46% at 50% 108%, rgba(232, 194, 90, 0.20), transparent 62%),
|
|
89
|
+
radial-gradient(ellipse 90% 70% at 50% -10%, rgba(120, 100, 255, 0.07), transparent 60%),
|
|
90
|
+
radial-gradient(ellipse 120% 100% at 50% 120%, #0b0b14 0%, var(--bg) 55%);
|
|
91
|
+
}
|
|
92
|
+
.hero::before {
|
|
93
|
+
content: ''; position: absolute; left: 50%; top: 0; bottom: 0;
|
|
94
|
+
width: min(1200px, 100%); transform: translateX(-50%);
|
|
95
|
+
background:
|
|
96
|
+
linear-gradient(115deg, transparent 46%, rgba(255, 255, 255, 0.05) 50%, transparent 54%),
|
|
97
|
+
linear-gradient(65deg, transparent 46%, rgba(255, 255, 255, 0.035) 50%, transparent 54%);
|
|
98
|
+
background-size: 100% 100%, 100% 100%;
|
|
99
|
+
filter: blur(1px);
|
|
100
|
+
pointer-events: none;
|
|
101
|
+
}
|
|
102
|
+
.hero-grain {
|
|
103
|
+
position: absolute; inset: 0; pointer-events: none; opacity: 0.05;
|
|
104
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)' opacity='0.6'/%3E%3C/svg%3E");
|
|
105
|
+
}
|
|
106
|
+
.hero-inner { position: relative; z-index: 2; }
|
|
107
|
+
.hero-kicker {
|
|
108
|
+
font-size: 13px; letter-spacing: 4px; color: var(--gold);
|
|
109
|
+
font-weight: 500; margin-bottom: 18px; opacity: 0.9;
|
|
110
|
+
}
|
|
111
|
+
.hero-title {
|
|
112
|
+
font-family: var(--font-display);
|
|
113
|
+
font-size: clamp(64px, 15vw, 190px);
|
|
114
|
+
line-height: 0.92;
|
|
115
|
+
letter-spacing: 0.02em;
|
|
116
|
+
text-shadow: 0 6px 40px rgba(0, 0, 0, 0.6);
|
|
117
|
+
overflow: hidden;
|
|
118
|
+
}
|
|
119
|
+
.hero-title .h-letter { display: inline-block; will-change: transform; }
|
|
120
|
+
.hero-title .h-letter.is-space { width: 0.4em; }
|
|
121
|
+
.hero-sub {
|
|
122
|
+
margin: 22px auto 0; max-width: 620px;
|
|
123
|
+
color: var(--muted); font-size: clamp(14px, 2vw, 17px);
|
|
124
|
+
}
|
|
125
|
+
.hero-badges {
|
|
126
|
+
display: flex; gap: 12px; justify-content: center; flex-wrap: wrap;
|
|
127
|
+
margin-top: 22px;
|
|
128
|
+
}
|
|
129
|
+
.hero-badges span {
|
|
130
|
+
font-size: 12px; letter-spacing: 1px; color: var(--gold-soft);
|
|
131
|
+
border: 1px solid rgba(232, 194, 90, 0.35);
|
|
132
|
+
border-radius: 999px; padding: 5px 14px;
|
|
133
|
+
background: rgba(232, 194, 90, 0.06);
|
|
134
|
+
}
|
|
135
|
+
.hero-cta { display: flex; gap: 14px; justify-content: center; margin-top: 30px; flex-wrap: wrap; }
|
|
136
|
+
|
|
137
|
+
.btn-gold, .btn-ghost {
|
|
138
|
+
display: inline-block; padding: 13px 28px; border-radius: 999px;
|
|
139
|
+
font-size: 15px; font-weight: 700; transition: transform 0.2s, box-shadow 0.2s, background 0.2s;
|
|
140
|
+
}
|
|
141
|
+
.btn-gold {
|
|
142
|
+
background: linear-gradient(135deg, var(--gold-soft), var(--gold) 55%, var(--gold-deep));
|
|
143
|
+
color: #14100a; box-shadow: 0 8px 30px rgba(232, 194, 90, 0.3);
|
|
144
|
+
}
|
|
145
|
+
.btn-gold:hover { transform: translateY(-2px); box-shadow: 0 12px 36px rgba(232, 194, 90, 0.45); }
|
|
146
|
+
.btn-ghost {
|
|
147
|
+
border: 1px solid rgba(255, 255, 255, 0.22); color: var(--ink);
|
|
148
|
+
}
|
|
149
|
+
.btn-ghost:hover { background: rgba(255, 255, 255, 0.06); transform: translateY(-2px); }
|
|
150
|
+
|
|
151
|
+
.hero-stage {
|
|
152
|
+
position: relative; z-index: 2;
|
|
153
|
+
margin-top: 26px;
|
|
154
|
+
width: min(560px, 92vw);
|
|
155
|
+
}
|
|
156
|
+
.hero-demo { display: flex; justify-content: center; }
|
|
157
|
+
.hero-demo .demo-stage { background: transparent; }
|
|
158
|
+
.hero-demo .bj-fig { width: clamp(220px, 34vw, 330px); height: auto; filter: drop-shadow(0 10px 30px rgba(0,0,0,.5)); }
|
|
159
|
+
.hero-floor {
|
|
160
|
+
height: 44px; margin: -16px auto 0;
|
|
161
|
+
width: min(440px, 80vw);
|
|
162
|
+
background: radial-gradient(ellipse 50% 100% at 50% 50%, rgba(232, 194, 90, 0.22), transparent 70%);
|
|
163
|
+
filter: blur(6px);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* ---------- Marquee ---------- */
|
|
167
|
+
.marquee {
|
|
168
|
+
overflow: hidden; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
|
|
169
|
+
background: var(--bg2); padding: 14px 0;
|
|
170
|
+
}
|
|
171
|
+
.marquee-track {
|
|
172
|
+
display: flex; gap: 46px; white-space: nowrap; width: max-content;
|
|
173
|
+
animation: marquee 26s linear infinite;
|
|
174
|
+
font-family: var(--font-display);
|
|
175
|
+
font-size: 17px; letter-spacing: 3px;
|
|
176
|
+
}
|
|
177
|
+
.marquee-track span { color: rgba(246, 243, 234, 0.55); }
|
|
178
|
+
.marquee-track span:nth-child(odd) { color: rgba(232, 194, 90, 0.75); }
|
|
179
|
+
@keyframes marquee { to { transform: translateX(-50%); } }
|
|
180
|
+
|
|
181
|
+
/* ---------- 通用 section ---------- */
|
|
182
|
+
.section { padding: clamp(64px, 9vw, 110px) 20px; position: relative; }
|
|
183
|
+
.section:nth-of-type(even) { background: var(--bg2); }
|
|
184
|
+
.container { max-width: 1120px; margin: 0 auto; }
|
|
185
|
+
|
|
186
|
+
.sec-kicker {
|
|
187
|
+
font-family: var(--font-display); font-size: 15px; letter-spacing: 4px;
|
|
188
|
+
color: var(--gold); margin-bottom: 10px;
|
|
189
|
+
}
|
|
190
|
+
.sec-title {
|
|
191
|
+
font-family: var(--font-display);
|
|
192
|
+
font-size: clamp(34px, 6vw, 58px); line-height: 1.08;
|
|
193
|
+
letter-spacing: 1px;
|
|
194
|
+
}
|
|
195
|
+
.sec-sub { color: var(--muted); margin-top: 12px; max-width: 640px; }
|
|
196
|
+
.sec-sub b { color: var(--gold-soft); }
|
|
197
|
+
|
|
198
|
+
/* ---------- About ---------- */
|
|
199
|
+
.about-grid {
|
|
200
|
+
display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
201
|
+
gap: 18px; margin-top: 40px;
|
|
202
|
+
}
|
|
203
|
+
.about-card {
|
|
204
|
+
background: linear-gradient(160deg, var(--panel2), var(--panel));
|
|
205
|
+
border: 1px solid var(--line); border-radius: 18px;
|
|
206
|
+
padding: 26px 26px 30px;
|
|
207
|
+
transition: transform 0.25s, border-color 0.25s;
|
|
208
|
+
}
|
|
209
|
+
.about-card:hover { transform: translateY(-4px); border-color: rgba(232, 194, 90, 0.35); }
|
|
210
|
+
.about-card h3 { font-size: 18px; margin-bottom: 10px; color: var(--gold-soft); }
|
|
211
|
+
.about-card p { color: var(--muted); font-size: 15px; }
|
|
212
|
+
.about-card b { color: var(--ink); }
|
|
213
|
+
|
|
214
|
+
.stats {
|
|
215
|
+
display: flex; justify-content: center; gap: clamp(26px, 6vw, 80px);
|
|
216
|
+
flex-wrap: wrap; margin-top: 46px;
|
|
217
|
+
padding: 26px; border: 1px solid var(--line); border-radius: 20px;
|
|
218
|
+
background: radial-gradient(ellipse at 50% 120%, rgba(232,194,90,.09), transparent 70%), var(--panel);
|
|
219
|
+
}
|
|
220
|
+
.stat { text-align: center; }
|
|
221
|
+
.stat b {
|
|
222
|
+
display: block;
|
|
223
|
+
font-family: var(--font-display);
|
|
224
|
+
font-size: clamp(38px, 6vw, 60px);
|
|
225
|
+
color: var(--gold);
|
|
226
|
+
line-height: 1.1;
|
|
227
|
+
}
|
|
228
|
+
.stat span { color: var(--muted); font-size: 13px; letter-spacing: 1px; }
|
|
229
|
+
|
|
230
|
+
/* ---------- Moves grid ---------- */
|
|
231
|
+
.moves-grid {
|
|
232
|
+
display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
|
|
233
|
+
gap: 16px; margin-top: 38px;
|
|
234
|
+
}
|
|
235
|
+
.move-card {
|
|
236
|
+
background: var(--panel); border: 1px solid var(--line); border-radius: 16px;
|
|
237
|
+
padding: 20px 18px 16px;
|
|
238
|
+
display: flex; flex-direction: column; gap: 6px;
|
|
239
|
+
transition: transform 0.25s, border-color 0.25s, box-shadow 0.25s;
|
|
240
|
+
position: relative; overflow: hidden;
|
|
241
|
+
}
|
|
242
|
+
.move-card::before {
|
|
243
|
+
content: ''; position: absolute; inset: auto -30% -55% -30%; height: 90%;
|
|
244
|
+
background: radial-gradient(ellipse at 50% 100%, rgba(232,194,90,.16), transparent 70%);
|
|
245
|
+
opacity: 0; transition: opacity 0.3s;
|
|
246
|
+
}
|
|
247
|
+
.move-card:hover {
|
|
248
|
+
transform: translateY(-5px);
|
|
249
|
+
border-color: rgba(232, 194, 90, 0.45);
|
|
250
|
+
box-shadow: 0 14px 34px rgba(0, 0, 0, 0.4);
|
|
251
|
+
}
|
|
252
|
+
.move-card:hover::before { opacity: 1; }
|
|
253
|
+
.mc-top { display: flex; justify-content: space-between; align-items: center; }
|
|
254
|
+
.mc-icon { font-size: 26px; }
|
|
255
|
+
.mc-diff { color: var(--gold); font-size: 13px; letter-spacing: 1px; }
|
|
256
|
+
.mc-en {
|
|
257
|
+
font-family: var(--font-display); font-size: 22px; letter-spacing: 1px;
|
|
258
|
+
margin-top: 4px;
|
|
259
|
+
}
|
|
260
|
+
.mc-cn { color: var(--muted); font-size: 14px; }
|
|
261
|
+
.mc-danger {
|
|
262
|
+
color: var(--red); font-weight: 700;
|
|
263
|
+
border: 1px solid rgba(255, 92, 92, 0.4); border-radius: 6px;
|
|
264
|
+
padding: 1px 6px; font-size: 11px; margin-left: 6px;
|
|
265
|
+
}
|
|
266
|
+
.mc-tags { display: flex; gap: 6px; margin-top: 8px; flex-wrap: wrap; }
|
|
267
|
+
.mc-tags span {
|
|
268
|
+
font-size: 11px; color: var(--muted);
|
|
269
|
+
border: 1px solid var(--line); border-radius: 999px; padding: 2px 9px;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/* ---------- Move lessons ---------- */
|
|
273
|
+
.move-block {
|
|
274
|
+
display: grid; grid-template-columns: minmax(300px, 5fr) minmax(340px, 6fr);
|
|
275
|
+
gap: clamp(24px, 5vw, 60px);
|
|
276
|
+
align-items: start;
|
|
277
|
+
padding: clamp(28px, 4vw, 46px) 0;
|
|
278
|
+
border-bottom: 1px solid var(--line);
|
|
279
|
+
}
|
|
280
|
+
.move-block:last-child { border-bottom: none; }
|
|
281
|
+
.move-visual { position: relative; }
|
|
282
|
+
.move-ghost {
|
|
283
|
+
position: absolute; font-size: clamp(120px, 16vw, 200px);
|
|
284
|
+
opacity: 0.05; top: 50%; left: 50%; transform: translate(-50%, -50%);
|
|
285
|
+
pointer-events: none; z-index: 0;
|
|
286
|
+
}
|
|
287
|
+
.move-demo {
|
|
288
|
+
position: relative; z-index: 1;
|
|
289
|
+
background:
|
|
290
|
+
radial-gradient(ellipse 70% 55% at 50% 96%, rgba(232, 194, 90, 0.14), transparent 70%),
|
|
291
|
+
linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0));
|
|
292
|
+
border: 1px solid var(--line); border-radius: 22px;
|
|
293
|
+
padding: 18px 16px 14px;
|
|
294
|
+
}
|
|
295
|
+
.demo-stage { display: flex; flex-direction: column; align-items: center; }
|
|
296
|
+
.bj-fig { width: min(250px, 72%); height: auto; }
|
|
297
|
+
.bj-seg { stroke: #f4e9cf; stroke-width: 4.6; stroke-linecap: round; }
|
|
298
|
+
.bj-fig circle.bj-seg { fill: #f4e9cf; stroke: none; }
|
|
299
|
+
.bj-hat { stroke: var(--gold); stroke-width: 4; stroke-linecap: round; fill: none; }
|
|
300
|
+
.bj-root { filter: drop-shadow(0 0 6px rgba(232, 194, 90, 0.12)); }
|
|
301
|
+
|
|
302
|
+
.demo-controls {
|
|
303
|
+
display: flex; align-items: center; justify-content: center;
|
|
304
|
+
gap: 10px; margin-top: 12px; flex-wrap: wrap;
|
|
305
|
+
}
|
|
306
|
+
.dctl-play, .dctl-btn {
|
|
307
|
+
border: 1px solid rgba(232, 194, 90, 0.4);
|
|
308
|
+
background: rgba(232, 194, 90, 0.08);
|
|
309
|
+
color: var(--gold-soft);
|
|
310
|
+
border-radius: 999px;
|
|
311
|
+
transition: background 0.2s, transform 0.15s;
|
|
312
|
+
}
|
|
313
|
+
.dctl-play { width: 44px; height: 44px; display: inline-flex; align-items: center; justify-content: center; }
|
|
314
|
+
.dctl-play:hover, .dctl-btn:hover { background: rgba(232, 194, 90, 0.22); }
|
|
315
|
+
.dctl-play:active, .dctl-btn:active { transform: scale(0.94); }
|
|
316
|
+
.dctl-play .ic-play { fill: currentColor; }
|
|
317
|
+
.dctl-play .ic-pause { display: none; }
|
|
318
|
+
.dctl-play.is-playing .ic-play { display: none; }
|
|
319
|
+
.dctl-play.is-playing .ic-pause { display: block; }
|
|
320
|
+
.dctl-btn {
|
|
321
|
+
min-width: 40px; padding: 8px 12px; font-size: 13px; font-weight: 700;
|
|
322
|
+
}
|
|
323
|
+
.dctl-btn.is-on {
|
|
324
|
+
background: linear-gradient(135deg, var(--gold-soft), var(--gold));
|
|
325
|
+
color: #14100a; border-color: transparent;
|
|
326
|
+
}
|
|
327
|
+
.dctl-speed { display: flex; gap: 6px; }
|
|
328
|
+
|
|
329
|
+
.move-body { min-width: 0; }
|
|
330
|
+
.move-head { display: flex; gap: 16px; align-items: baseline; }
|
|
331
|
+
.move-no {
|
|
332
|
+
font-family: var(--font-display); font-size: 30px; color: var(--gold);
|
|
333
|
+
opacity: 0.55;
|
|
334
|
+
}
|
|
335
|
+
.move-en {
|
|
336
|
+
font-family: var(--font-display);
|
|
337
|
+
font-size: clamp(28px, 4vw, 40px); letter-spacing: 1px; line-height: 1;
|
|
338
|
+
}
|
|
339
|
+
.move-cn { color: var(--muted); font-size: 14px; margin-top: 6px; }
|
|
340
|
+
.move-music { margin-top: 10px; }
|
|
341
|
+
.chip {
|
|
342
|
+
display: inline-block; font-size: 12.5px; color: var(--gold-soft);
|
|
343
|
+
border: 1px dashed rgba(232, 194, 90, 0.4); border-radius: 999px;
|
|
344
|
+
padding: 4px 12px;
|
|
345
|
+
background: rgba(232, 194, 90, 0.05);
|
|
346
|
+
}
|
|
347
|
+
.danger-note {
|
|
348
|
+
margin-top: 14px; padding: 12px 16px;
|
|
349
|
+
border: 1px solid rgba(255, 92, 92, 0.4); border-radius: 12px;
|
|
350
|
+
background: rgba(255, 92, 92, 0.08);
|
|
351
|
+
color: #ffd7d7; font-size: 13.5px;
|
|
352
|
+
}
|
|
353
|
+
.danger-note b { color: var(--red); }
|
|
354
|
+
|
|
355
|
+
.mini-title {
|
|
356
|
+
margin: 22px 0 10px; font-weight: 700; font-size: 14.5px;
|
|
357
|
+
color: var(--ink); letter-spacing: 1px;
|
|
358
|
+
}
|
|
359
|
+
.mini-title small { color: var(--muted); font-weight: 400; font-size: 12px; letter-spacing: 0; }
|
|
360
|
+
|
|
361
|
+
.step-list { list-style: none; display: flex; flex-direction: column; gap: 8px; }
|
|
362
|
+
.step-list li {
|
|
363
|
+
display: flex; gap: 12px; align-items: flex-start;
|
|
364
|
+
border: 1px solid var(--line); border-radius: 12px;
|
|
365
|
+
padding: 10px 14px;
|
|
366
|
+
background: var(--panel);
|
|
367
|
+
font-size: 14.5px; color: var(--muted);
|
|
368
|
+
transition: border-color 0.3s, background 0.3s, color 0.3s, transform 0.3s;
|
|
369
|
+
}
|
|
370
|
+
.step-list li.is-active {
|
|
371
|
+
border-color: rgba(232, 194, 90, 0.6);
|
|
372
|
+
background: rgba(232, 194, 90, 0.07);
|
|
373
|
+
color: var(--ink);
|
|
374
|
+
transform: translateX(4px);
|
|
375
|
+
}
|
|
376
|
+
.step-no {
|
|
377
|
+
flex: none; width: 24px; height: 24px; border-radius: 50%;
|
|
378
|
+
background: var(--line); color: var(--muted);
|
|
379
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
380
|
+
font-size: 12.5px; font-weight: 700; margin-top: 1px;
|
|
381
|
+
transition: background 0.3s, color 0.3s;
|
|
382
|
+
}
|
|
383
|
+
.step-list li.is-active .step-no {
|
|
384
|
+
background: var(--gold); color: #14100a;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
.cols2 {
|
|
388
|
+
display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 4px;
|
|
389
|
+
}
|
|
390
|
+
.cols2 .mini-title { margin-top: 20px; }
|
|
391
|
+
.tips-list, .mistake-list { list-style: none; display: flex; flex-direction: column; gap: 7px; }
|
|
392
|
+
.tips-list li, .mistake-list li {
|
|
393
|
+
font-size: 13.5px; color: var(--muted);
|
|
394
|
+
padding-left: 20px; position: relative;
|
|
395
|
+
}
|
|
396
|
+
.tips-list li::before { content: '✓'; position: absolute; left: 0; color: var(--gold); font-weight: 700; }
|
|
397
|
+
.mistake-list li::before { content: '✗'; position: absolute; left: 0; color: var(--red); font-weight: 700; }
|
|
398
|
+
|
|
399
|
+
.fact-box {
|
|
400
|
+
margin-top: 22px; border: 1px solid var(--line); border-radius: 12px;
|
|
401
|
+
background: var(--panel); overflow: hidden;
|
|
402
|
+
}
|
|
403
|
+
.fact-box summary {
|
|
404
|
+
cursor: pointer; padding: 12px 16px; font-size: 14px; font-weight: 700;
|
|
405
|
+
color: var(--gold-soft); user-select: none;
|
|
406
|
+
transition: background 0.2s;
|
|
407
|
+
}
|
|
408
|
+
.fact-box summary:hover { background: rgba(232, 194, 90, 0.05); }
|
|
409
|
+
.fact-box p {
|
|
410
|
+
padding: 0 16px 14px; font-size: 13.5px; color: var(--muted);
|
|
411
|
+
border-top: 1px dashed var(--line); padding-top: 12px;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/* ---------- Timeline ---------- */
|
|
415
|
+
.timeline { background: var(--bg2); }
|
|
416
|
+
.beat-dots {
|
|
417
|
+
display: flex; justify-content: center; gap: clamp(10px, 3vw, 22px);
|
|
418
|
+
margin: 40px 0 30px; align-items: center;
|
|
419
|
+
}
|
|
420
|
+
.beat-dot {
|
|
421
|
+
width: 14px; height: 14px; border-radius: 50%;
|
|
422
|
+
background: rgba(246, 243, 234, 0.25);
|
|
423
|
+
box-shadow: 0 0 0 4px rgba(255,255,255,0.03);
|
|
424
|
+
}
|
|
425
|
+
.beat-dot.acc { width: 18px; height: 18px; background: var(--gold); box-shadow: 0 0 14px rgba(232,194,90,.8); }
|
|
426
|
+
.timeline-grid {
|
|
427
|
+
display: flex; flex-direction: column; gap: 10px;
|
|
428
|
+
max-width: 760px; margin: 0 auto;
|
|
429
|
+
}
|
|
430
|
+
.tl-row {
|
|
431
|
+
display: grid; grid-template-columns: 46px 1fr auto;
|
|
432
|
+
gap: 16px; align-items: center;
|
|
433
|
+
background: var(--panel); border: 1px solid var(--line);
|
|
434
|
+
border-radius: 14px; padding: 13px 18px;
|
|
435
|
+
transition: transform 0.2s, border-color 0.2s;
|
|
436
|
+
}
|
|
437
|
+
.tl-row:hover { transform: translateX(6px); border-color: rgba(232, 194, 90, 0.4); }
|
|
438
|
+
.tl-count {
|
|
439
|
+
font-family: var(--font-display); font-size: 22px; color: var(--gold);
|
|
440
|
+
text-align: center;
|
|
441
|
+
background: rgba(232, 194, 90, 0.08); border-radius: 10px; padding: 4px 0;
|
|
442
|
+
}
|
|
443
|
+
.tl-row:nth-child(1) .tl-count, .tl-row:nth-child(5) .tl-count {
|
|
444
|
+
color: #14100a; background: linear-gradient(135deg, var(--gold-soft), var(--gold));
|
|
445
|
+
}
|
|
446
|
+
.tl-move { font-weight: 700; font-size: 15.5px; }
|
|
447
|
+
.tl-note { color: var(--muted); font-size: 12.5px; text-align: right; }
|
|
448
|
+
.tl-fine { text-align: center; color: var(--muted); font-size: 12.5px; margin-top: 24px; }
|
|
449
|
+
|
|
450
|
+
/* ---------- Metronome ---------- */
|
|
451
|
+
.metro-box {
|
|
452
|
+
margin-top: 36px;
|
|
453
|
+
display: grid; grid-template-columns: auto 1fr; gap: clamp(24px, 5vw, 60px);
|
|
454
|
+
align-items: center;
|
|
455
|
+
background: radial-gradient(ellipse at 50% 0%, rgba(232,194,90,.08), transparent 60%), var(--panel);
|
|
456
|
+
border: 1px solid var(--line); border-radius: 24px;
|
|
457
|
+
padding: clamp(26px, 5vw, 46px);
|
|
458
|
+
max-width: 820px; margin-left: auto; margin-right: auto;
|
|
459
|
+
}
|
|
460
|
+
.metro-main { display: flex; flex-direction: column; align-items: center; gap: 20px; }
|
|
461
|
+
.metro-disc {
|
|
462
|
+
width: 130px; height: 130px; border-radius: 50%;
|
|
463
|
+
background:
|
|
464
|
+
radial-gradient(circle at 32% 28%, rgba(255,255,255,.18), transparent 40%),
|
|
465
|
+
radial-gradient(circle at 50% 120%, var(--gold-deep), var(--gold) 70%);
|
|
466
|
+
box-shadow: 0 0 0 10px rgba(232,194,90,.06), 0 0 44px rgba(232,194,90,.35), inset 0 -6px 18px rgba(0,0,0,.3);
|
|
467
|
+
display: flex; align-items: center; justify-content: center;
|
|
468
|
+
will-change: transform;
|
|
469
|
+
}
|
|
470
|
+
.metro-disc span {
|
|
471
|
+
font-family: var(--font-display); font-size: 54px; color: #1a1409;
|
|
472
|
+
text-shadow: 0 1px 0 rgba(255,255,255,.35);
|
|
473
|
+
}
|
|
474
|
+
.metro-side { min-width: 0; }
|
|
475
|
+
.metro-side label { font-size: 15px; color: var(--muted); }
|
|
476
|
+
.metro-side label b { color: var(--gold); font-family: var(--font-display); font-size: 22px; }
|
|
477
|
+
.metro-side input[type='range'] {
|
|
478
|
+
width: 100%; margin: 14px 0 18px; accent-color: var(--gold); height: 6px;
|
|
479
|
+
}
|
|
480
|
+
.metro-tip { font-size: 13px; color: var(--muted); }
|
|
481
|
+
|
|
482
|
+
/* ---------- Plan ---------- */
|
|
483
|
+
.plan-grid {
|
|
484
|
+
display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
|
|
485
|
+
gap: 16px; margin-top: 40px;
|
|
486
|
+
}
|
|
487
|
+
.plan-card {
|
|
488
|
+
background: var(--panel); border: 1px solid var(--line); border-radius: 16px;
|
|
489
|
+
padding: 22px 20px; position: relative; overflow: hidden;
|
|
490
|
+
transition: transform 0.25s, border-color 0.25s;
|
|
491
|
+
}
|
|
492
|
+
.plan-card:hover { transform: translateY(-4px); border-color: rgba(232, 194, 90, 0.4); }
|
|
493
|
+
.plan-day {
|
|
494
|
+
font-family: var(--font-display); font-size: 13px; letter-spacing: 2px;
|
|
495
|
+
color: var(--gold);
|
|
496
|
+
border: 1px solid rgba(232,194,90,.35); border-radius: 999px;
|
|
497
|
+
padding: 3px 11px; background: rgba(232,194,90,.06);
|
|
498
|
+
}
|
|
499
|
+
.plan-card h3 { font-size: 17px; margin: 14px 0 6px; }
|
|
500
|
+
.plan-card p { color: var(--muted); font-size: 13.5px; }
|
|
501
|
+
.plan-card:last-child {
|
|
502
|
+
border-color: rgba(232, 194, 90, 0.5);
|
|
503
|
+
background:
|
|
504
|
+
radial-gradient(ellipse at 50% 130%, rgba(232,194,90,.18), transparent 65%),
|
|
505
|
+
var(--panel);
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/* ---------- Footer ---------- */
|
|
509
|
+
.footer {
|
|
510
|
+
border-top: 1px solid var(--line);
|
|
511
|
+
padding: 50px 20px 40px; text-align: center;
|
|
512
|
+
background: linear-gradient(to top, #050508, var(--bg));
|
|
513
|
+
}
|
|
514
|
+
.footer-brand {
|
|
515
|
+
font-family: var(--font-display); font-size: 22px; letter-spacing: 3px;
|
|
516
|
+
}
|
|
517
|
+
.footer-brand span { color: var(--gold); }
|
|
518
|
+
.footer-note { color: var(--muted); font-size: 12.5px; margin-top: 12px; line-height: 2; }
|
|
519
|
+
.footer-tech { color: rgba(232, 194, 90, 0.55); font-size: 12px; margin-top: 16px; letter-spacing: 1px; }
|
|
520
|
+
|
|
521
|
+
/* ---------- 回到顶部 ---------- */
|
|
522
|
+
.to-top {
|
|
523
|
+
position: fixed; right: 22px; bottom: 22px; z-index: 80;
|
|
524
|
+
width: 46px; height: 46px; border-radius: 50%;
|
|
525
|
+
border: 1px solid rgba(232, 194, 90, 0.5);
|
|
526
|
+
background: rgba(18, 18, 26, 0.9); color: var(--gold-soft);
|
|
527
|
+
font-size: 20px; opacity: 0; pointer-events: none;
|
|
528
|
+
transform: translateY(14px);
|
|
529
|
+
transition: opacity 0.3s, transform 0.3s;
|
|
530
|
+
}
|
|
531
|
+
.to-top.is-show { opacity: 1; pointer-events: auto; transform: translateY(0); }
|
|
532
|
+
.to-top:hover { background: rgba(232, 194, 90, 0.18); }
|
|
533
|
+
|
|
534
|
+
/* ---------- Reveal 初始态 ---------- */
|
|
535
|
+
.reveal { will-change: transform, opacity; }
|
|
536
|
+
|
|
537
|
+
/* ---------- 响应式 ---------- */
|
|
538
|
+
@media (max-width: 900px) {
|
|
539
|
+
.move-block { grid-template-columns: 1fr; }
|
|
540
|
+
.move-demo { max-width: 460px; }
|
|
541
|
+
.tl-row { grid-template-columns: 40px 1fr; }
|
|
542
|
+
.tl-note { grid-column: 2; text-align: left; font-size: 12px; }
|
|
543
|
+
.metro-box { grid-template-columns: 1fr; text-align: center; }
|
|
544
|
+
}
|
|
545
|
+
@media (max-width: 560px) {
|
|
546
|
+
.nav-links a { font-size: 12.5px; }
|
|
547
|
+
.cols2 { grid-template-columns: 1fr; }
|
|
548
|
+
.stats { gap: 26px; }
|
|
549
|
+
.hero { min-height: 92svh; }
|
|
550
|
+
}
|
|
551
|
+
@media (prefers-reduced-motion: reduce) {
|
|
552
|
+
.marquee-track { animation: none; }
|
|
553
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
========================================
|
|
2
|
+
BILLIE JEAN · 舞步拆解教学网站 — 安装说明
|
|
3
|
+
========================================
|
|
4
|
+
|
|
5
|
+
一、本地直接运行(最简单)
|
|
6
|
+
1. 下载/解压本项目
|
|
7
|
+
2. 在项目目录打开终端,运行:
|
|
8
|
+
python3 -m http.server 8734
|
|
9
|
+
3. 浏览器打开:http://127.0.0.1:8734
|
|
10
|
+
|
|
11
|
+
或直接双击 index.html 打开(无需服务器,纯静态页面)。
|
|
12
|
+
|
|
13
|
+
二、通过 npm 安装使用
|
|
14
|
+
1. 安装:
|
|
15
|
+
npm install billie-jean-dance
|
|
16
|
+
2. 找到安装位置:
|
|
17
|
+
node_modules/billie-jean-dance/
|
|
18
|
+
3. 在安装目录运行本地服务器:
|
|
19
|
+
cd node_modules/billie-jean-dance
|
|
20
|
+
npm start
|
|
21
|
+
4. 浏览器打开:http://127.0.0.1:8734
|
|
22
|
+
|
|
23
|
+
三、功能速览
|
|
24
|
+
- 8 大舞步拆解教学(太空步/脚尖站立/侧滑/转身/侧踢/脚跟脚尖滑动/前倾/抓帽甩帽)
|
|
25
|
+
- 每个动作:GSAP 火柴人动画演示,可播放/暂停/调速,步骤随动画高亮
|
|
26
|
+
- 跟跳时间线:副歌 8 拍连招
|
|
27
|
+
- 节拍器:117 BPM(Billie Jean 原速)可调
|
|
28
|
+
- 7 天练习计划
|
|
29
|
+
|
|
30
|
+
四、注意事项
|
|
31
|
+
- 页面从 CDN 加载 GSAP 与 Google Fonts,首次打开需联网
|
|
32
|
+
- 高风险动作(前倾 45°)请量力而行,做好保护
|
|
33
|
+
- 本站为致敬学习用途,与 Michael Jackson 官方无关
|
|
34
|
+
|
|
35
|
+
五、GitHub
|
|
36
|
+
https://github.com/Kilganon725/billie-jean-dance
|