ローディング系

Buckssauce Landing Page Reveal React

円形clip-pathの多層カラーリビールからフード画像を放射状に散らし、ズーム退場でSplitTextヒーローへ繋ぐランディング導入をReactへ移植しました。

Y
Yutaka Kizaki
@junkbranding
2026年7月10日
読了時間: 8分
構成 / File Structure
</>Code Viewer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323

📝 はじめに

このアニメーションは、ページを開いた瞬間の「プリローダーからヒーローへの導入」を扱います。ローディングを単なる待ち時間で終わらせず、円形のカラーリビールとフードアイテムの動きで、ブランドの世界観を一気に見せる場面で役立ちます。

この記事では、見た目の派手さよりも、どの要素をどの順番で動かすのかなぜプリローダーとヒーローをレイヤーで分けるのかReactでどうやって1本のGSAP timelineを安全に片付けるのかを重視します。元は素のHTML + module scriptだった実装を、責務を分けたReactコンポーネントへ移植しています。

🎯 今回作るもの

今回作るのは、ページ全体の完成演出ではなく、開いた瞬間だけを担当する導入リビールです。

  • 主役: 円形clip-pathの多層カラーリビール + 放射状に散るフードアイテム
  • トリガー: page load(document.fonts.ready を待って開始)
  • 対象要素: リビール面 / フード画像4枚 / ロゴ / ヒーロー見出し(SplitText)
  • 再利用先: 飲食・物販系のLP、キャンペーンページ、ブランドサイトのオープニング

🧩 コンポーネント設計

1つの Demo に処理を詰め込みますが、頭の中では役割を分けて考えます。

  • Demo

    • サンプル全体の親コンポーネント
    • rootRef を持ち、アニメーションの影響範囲をこのツリー内に閉じる
  • View / DOM

    • プリローダー層(リビール面・アイテム・ロゴ)とヒーロー層(nav・見出し・フッター・メインビジュアル)を別レイヤーで組む
    • フード画像は data: SVGで自己完結させ、外部画像に依存しない
  • Animation

    • document.fonts.ready を待ってから1本の gsap.timeline() を構築
    • SplitTextで文字・単語・行を分割し、順番に開放する
  • Style

    • z-index でプリローダー(2) > nav(1) > hero(0) の重なりを固定
    • clip-path: circle(...) の初期状態や、各要素の初期 scale / opacity を用意

🛠️ 実装のポイント

  • DOMとCSSの設計意図

    • プリローダーとヒーローを重ねて置き、リビール完了後に display: none でプリローダーを畳む
    • リビール面は4枚重ね、--base-200〜500 の色を層ごとに変えて、円が開くたびに色が切り替わって見えるようにする
    • フード画像は object-fit: contain にして、SVGの余白を保ったまま散らす
  • GSAP / SplitText の責務

    • GSAPは時間制御・順番・stagger・退場のイージングに専念する
    • SplitTextは「文字列をアニメ可能な単位へ割る」ことだけに使い、nav は words、h1 は chars、footer は lines と、粒度を要素ごとに変える
    • mask オプションで、はみ出した文字を親側でクリップする
  • タイムラインとパラメータ

    • stagger: 0.25(リビール面)で円が次々に開く間隔を作る
    • '-=0.55''<0.075' の相対ラベルで、アイテムの散開を少しずつ重ねる
    • 退場は scale: 2.5 + power2.in で、画面外へ吸い込むように加速させる
    • 見出しは elastic.out(0.75, 0.25) で、着地に弾みを持たせる
  • Reactでのクリーンアップ

    • rootRef で影響範囲を限定し、gsap.context(fn, rootRef) で生成物をまとめる
    • アンマウント時に context.revert() で全アニメーションを解除する
    • SplitTextは context.revert() では戻らないので、splits に貯めて個別に split.revert() する
    • document.fonts.ready の解決前にアンマウントされても壊れないよう、cancelled フラグでガードする

💡 使いどころとカスタマイズ

  • 最適なユースケース

    • 飲食・EC・キャンペーンLPのオープニング
    • ブランドロゴを主役にしたスプラッシュ画面
    • 「読み込み → 世界観提示 → ファーストビュー」を一続きで見せたい場面
  • 調整ダイヤル

    • itemTargetsx / y / rotation を変えると、アイテムの散らばり方が変わります。
    • EXIT_DISTANCE を大きくすると、退場時により遠くへ吹き飛びます。
    • リビール面の stagger を小さくすると、色の切り替えが素早くなります。
    • 見出しの stagger を大きくすると、文字が1つずつ立ち上がる印象が強くなります。
    • 浮遊 tween の durationy を変えると、待機中のふわふわ感を調整できます。

🔧 発展させるなら

この導入部を土台に、段階的に足していけます。

  1. まずはプリローダーの円形リビールとロゴ表示だけを動かす
  2. 次にフードアイテムの散開と浮遊を足す
  3. アイテムのズーム退場とヒーロー開放をつなぐ
  4. SplitTextの粒度(words / chars / lines)を要素ごとに調整する
  5. 必要ならLenisやScrollTriggerを足して、ヒーロー以降のスクロール演出へ接続する

最初から全部を入れず、レイヤーと責務を分けたまま1つずつ足すことで、壊れにくく再利用しやすい導入リビールになります。

タグ

GSAPSplitTextCSSJavaScriptプリローダーアニメーション

関連記事