Scroll Magic
Scroll Magic公式URL
スクロール位置に応じて要素のスタイルやアニメーションを制御可能
CDNの読み込み
<script src="//cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/ScrollMagic.min.js"></script>
2行目デバック用
<script src="//cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/plugins/debug.addIndicators.min.js"></script>
Scroll Magic トリガー
コントローラーの作成
const controller = new ScrollMagic.Controller();
トリガーの作成
const scene = new ScrollMagic.Scene({
triggerElement: "#target", //どの位置で発火させるか
triggerHook: 'onEnter', //トリガーの位置 /onEnter/onLeave デフォルトはonCenter
offset: 200, //スタート位置はトリガーから200px
duration: 1000, //終了距離
reverse:false, //逆戻りの時は実行しない
})
この要素を一定期間固定
.setPin("#target", {pushFollowers: false})
シーンのいろいろな情報が画面に表示され、アニメーションか名前を登録可能
.addIndicators({name: "ScrollMagicAnim1"});
作成したシーンを宣言したコントローラに設定
scene.addTo(controller);
TweenMaxなどでアニメーションを登録する場合
トリガーの作成
const scene = new ScrollMagic.Scene({
triggerElement: "#target", //どの位置で発火させるか
triggerHook: 'onEnter', //トリガーの位置 /onEnter/onLeave デフォルトはonCenter
offset: 200, //スタート位置はトリガーから200px
duration: 1000, //終了距離
reverse:false, //逆戻りの時は実行しない
})
TweenMaxなどでアニメーションを登録する場合
.setClassToggle("#target","active") //クラスのtoggle
.setTween(tween); //発火時のアニメーションを登録
scene.addTo(controller);
使用(デバック中)
Scroll Magic 1
Scroll Magic 2
Scroll Magic 3
HTML
<div class="main-container" id="main">
<div id="project01" class="project">
<div class="img"></div>
<h1>Scroll Magic 1</h1>
</div>
<div id="project02" class="project">
<div class="img"></div>
<h1>Scroll Magic 2</h1>
</div>
<div id="project03" class="project">
<div class="img"></div>
<h1>Scroll Magic 3</h1>
</div>
</div>
CSS
.main-container {
width: 100%;
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.project {
/* アニメーション設定 */
opacity: 0;
transform: translateY(50px);
transition: opacity 0.6s ease-out, transform 0.6s ease-out;
text-align: center;
margin: 50px;
}
.project.fade-in {
opacity: 1;
transform: translateY(0);
}
.img {
width: 200px;
height: 200px;
background-color:rgb(82,107,195);
border-radius: 50%;
margin: 0 auto;
}
.img {
width: 200px;
height: 200px;
background-color:rgb(82,107,195);
border-radius
: 50%;
}
/* ScrollMagic デバッグ表示のフォント変更 - より強力なセレクタ */
body div[style*="position"][style*="fixed"] {
font-family: 'Courier New', monospace !important;
font-size: 22px !important;
font-weight: 900 !important;
}
JavaScript
デバックは常に表示設定のコード
// コントローラーの作成
const controller = new ScrollMagic.Controller();
// 各プロジェクトにフェードインアニメーションを適用
const projects = ['#project01', '#project02', '#project03'];
projects.forEach((project, index) => {
new ScrollMagic.Scene({
triggerElement: project, //どの位置で発火させるか
triggerHook: 0.8, // 要素が画面の80%の位置に来た時に発火
reverse: true // スクロールダウン時もアニメーションを適用
})
.setClassToggle(project, 'fade-in')
.addIndicators({
name: `トリガー位置目安 ${index + 1}フェード`, // 右側の文字表示(STARTトリガー位置目安123フェード)
colorStart: 'green', // 右側に緑の文字表示(STARTトリガー位置目安123フェード)の色
colorTrigger: 'red', // 右側に赤の文字表示(TRIGGER)の色
indent: 200, // デバッグ表示を画面右端から200px左側に配置
})
.addTo(controller);
});
細かい設定
| 名前 | 用途 | コード例 |
|---|---|---|
| どの位置で発火させるか | どの位置で動かすか? | triggerElement: "#ID", |
| トリガーが発火する画面上の位置を指定 | 要素が画面の一番下に入った瞬間に発火=1 | triggerHook: 'onEnter' |
| トリガーが発火する画面上の位置を指定 | 要素が画面の中央に来た時に発火=0.5(デフォルト値) | triggerHook: 'onCenter' |
| トリガーが発火する画面上の位置を指定 | 要素が画面の一番上に到達した時に発火=0 | triggerHook: 'onLeave' |
| トリガーが発火する画面上の位置を指定 | 画面の80%の位置(上から80%の場所)に要素が来た時に発火 | triggerHook: 0.8 |
| スタート位置の調整 | トリガー要素の位置でちょうど発火(デフォルト) | offset: 0, |
| スタート位置の調整 | トリガー要素より200px下でスタート | offset: 200, |
| スタート位置の調整 | トリガー要素より100px上でスタート | offset: -100, |
| スタート位置の調整 | 画面の高さの50%分オフセット | offset: "50%", |
| アニメーションの継続距離 | スクロールを上下に動かすと、要素が出現・消失を繰り返す | duration: 0, |
| アニメーションの継続距離 | 瞬時に完了(デフォルト) | reverse: true |
| アニメーションの継続距離 | 300pxスクロールする間継続 | duration: 300, |
| アニメーションの継続距離 | 1000pxスクロールする間継続 | duration: 1000, |
| アニメーションの継続距離 | 画面の高さ分継続 | duration: "100%", |
| アニメーションの継続距離 | 画面の高さの2倍分継続 | duration: "200%", |
| アニメーションの継続距離 | 画面の高さ分継続(動的) | duration: window.innerHeight, |
| 発火タイミング繰り返し | スクロールを上下に動かすと、要素が出現・消失を繰り返す | reverse: true |
| 発火タイミング繰り返し | 一度表示された要素は、上にスクロールしても表示されたまま | reverse: false |
triggerHook値の視覚的説明
0 (onLeave) ← 要素がここに来ると発火
0.5 (onCenter) ← 要素がここに来ると発火
0.8 ← 要素がここに来ると発火
1 (onEnter) ← 要素がここに来ると発火