パララックスとは視差効果という意味ですが、言葉で解説するより見た方が早いと思います。
今回はGSAPを使った方法を解説するので、最初にGSAPの使い方を読みましょう。
GSAPとは?基本的な使い方とアニメーションのサンプル付きで解説
続きを見る
また、パララックスに関する記事は当ブログに他に4記事あります。
CSSのみでスマホ対応のパララックスを作る方法【サンプル付きで解説】
続きを見る
スマホ対応パララックス『simpleParallax.js』の使い方はこちら
スマホ対応パララックス『simpleParallax.js』の使い方【サンプル付きで解説】
続きを見る
Luxy.jsでパララックスと慣性スクロールを実装する方法はこちら。
Luxy.jsでパララックスと慣性スクロールを実装する方法【JavaScriptのプラグイン】
続きを見る
【Swiper】パララックススライダーを作る方法【サンプル付き】
続きを見る
重要なコード以外は省略している箇所が多いので、全部見たい人はCodePen左上のHTML・CSS・JSをクリックして下さい。
(有料になっていたらすいません🙇♂️)
GSAPでパララックスをScrollTriggerを使って実装する方法
それでは、GSAPでパララックスを実装する方法を解説していきます。
今回は、GSAPのプラグインScrollTriggerを使います。
【GSAP】ScrollTriggerの使い方とスクロールアニメーションのサンプルを紹介
続きを見る
並ぶ要素を異なる速度でパララックス
まずは、横に並べた要素を異なる速度でパララックスしていきます。
HTMLの書き方はこちら。
<div class="container js-trigger">
<div class="box box01"></div>
<div class="box box02"></div>
<div class="box box03"></div>
<div class="box box04"></div>
<div class="box box05"></div>
</div>
HTMLは、特筆するポイントはありません。
JavaScriptの書き方はこちら。
gsap.fromTo(
".box02", // アニメーションさせる要素
{
yPercent: 100, // 下に要素の幅の1倍分移動
},
{
yPercent: -100, // 上に要素の幅の1倍分移動
ease: "none", // イージングなし
scrollTrigger: {
trigger: ".js-trigger", // アニメーションのトリガー要素
start: "top bottom", // アニメーション開始位置
end: "bottom top", // アニメーション終了位置
scrub: true, // 動作を遅くさせない
},
}
);
gsap.fromTo(
".box03", // アニメーションさせる要素
{
yPercent: 200, // 下に要素の幅の2倍分移動
},
{
yPercent: -200, // 上に要素の幅の2倍分移動
ease: "none", // イージングなし
scrollTrigger: {
trigger: ".js-trigger", // アニメーションのトリガー要素
start: "top bottom", // アニメーション開始位置
end: "bottom top", // アニメーション終了位置
scrub: 1, // 動作が遅くなる
},
}
);
gsap.fromTo(
".box04", // アニメーションさせる要素
{
yPercent: 300, // 下に要素の幅の3倍分移動
},
{
yPercent: -300, // 上に要素の幅の3倍分移動
ease: "none", // イージングなし
scrollTrigger: {
trigger: ".js-trigger", // アニメーションのトリガー要素
start: "top bottom", // アニメーション開始位置
end: "bottom top", // アニメーション終了位置
scrub: 2, // 動作が遅くなる
},
}
);
gsap.fromTo(
".box05", // アニメーションさせる要素
{
yPercent: 400, // 下に要素の幅の4倍分移動
},
{
yPercent: -400, // 上に要素の幅の4倍分移動
ease: "none", // イージングなし
scrollTrigger: {
trigger: ".js-trigger", // アニメーションのトリガー要素
start: "top bottom", // アニメーション開始位置
end: "bottom top", // アニメーション終了位置
scrub: 3, // 動作が遅くなる
},
}
);
ちょっと長いので、箇条書きで補足します。
fromTo
はアニメーションの開始から終了まで指定するメソッドease
のイージングは全てなしtrigger
のアニメーションのトリガーは全て同じタイミング(.boxを囲っている親要素).box01
はアニメーションなしscrub
はスクロール量に合わせてアニメーションさせるプロパティ.box02
はscrub: true
で動作は遅れない.box03〜.box05
はscrub: 数値
は、数値が大きいほど動作が遅くなる- 最初の
yPercent
はアニメーション前の位置 - 2つ目の
yPercent
はアニメーション後の位置
ポイントはscrub
で、スクロール量に合わせてアニメーションさせているところです。
これを数値にすると、数値が大きいほど遅く動きます。
こちらがサンプルになります。
See the Pen
Untitled by junpei (@junpei-sugiyama)
on CodePen.
確認するポイントは以下になります。
- スクロールすると要素が異なる速度で動く
- 1つ目と2つ目の要素は動き出すタイミングは同じで、動く速度は違う
- 3〜5つ目はそれぞれ動き出すタイミングが遅れる
これは、何度も上下にスクロールして確認すると分かるかと思います。
画像をパララックス
次は、画像をパララックスさせます。
JavaScriptの書き方はこちら。
// セレクタ ".js-trigger" で要素を取得
const items = gsap.utils.toArray(".js-trigger");
// 各要素に対してアニメーションを設定
items.forEach((item) => {
gsap.fromTo(
item.querySelector("img"), // アニメーションを適用する画像要素を取得
{
yPercent: 0, // パララックス前の要素の位置
},
{
yPercent: -20, // 上に要素の幅の1/5分移動
ease: "none", // イージングなし
scrollTrigger: {
trigger: item, // アニメーションのトリガー要素
start: "top bottom", // アニメーション開始位置
end: "bottom top", // アニメーション終了位置
scrub: 1, // 動作を遅らせる
},
}
);
});
CSSで重要な箇所は2つだけです。
- imgタグの親要素にclass名を付与(今回は
js-trigger
) - imgタグの親要素に
height
とoverflow: hidden;
を指定
js-trigger
はJavaScriptで使うclass名で、名前は任意です。
あとは、height
とoverflow: hidden;
ではみ出させる&はみ出した部分を隠すことで、動いているように見えます。
あとJavaScriptでyPercent: -20
とありますが、これは『要素の幅の20%上に移動』と言う意味になります。
pxで指定もできますが、そうすると画像サイズに合わせて変えることができないので、今回はyPercent
を使っています。
サンプルがこちらです。
See the Pen
Untitled by junpei (@junpei-sugiyama)
on CodePen.
サンプルではちょっと大きく動かしていますが、上下が切れるので画像によっては注意が必要です(今回だと犬の耳が切れている)。
まとめ
今回は、GSAPを使ったパララックスの実装方法を解説しました。
パララックスは気が付かない程度の動きにするくらいが、ちょうどいいかと思います。
以上になります。