Webサイトを作っていると、スクロールアニメーションを取り入れたくなること、ありませんか?スクロールするたびにアニメーションが発動するのって、ユーザーにとっても楽しいし、サイトが動きのある印象を与えてくれますよね。でも、アニメーションをうまく実装するのって意外と大変で、パフォーマンスにも気を使わなきゃいけません。
そんなときに便利なのが「Intersection Observer API」。これを使えば、スクロール時に特定の要素が画面に現れたときにアニメーションを発動させることができるんです。しかも、パフォーマンスも最適化できるから、ユーザーの体験を損なわずに、スマートに実装できます。
今回は、このIntersection Observerを使ってスクロールアニメーションを実装する方法をわかりやすく紹介していきます!
1. Intersection Observer APIって?
まず、Intersection Observer APIの基本的なところからおさらいしておきましょう。簡単に言うと、このAPIを使うと、ある要素が画面に表示されたとき(または一定の割合で表示されたとき)に、何かしらのアクションを起こせるんです。
たとえば、スクロールしてきたときに、特定の要素がビューに現れるタイミングを検知して、そのタイミングでアニメーションを開始したり、画像を遅延読み込み(Lazy Load)したりできます。
こんな感じで、ターゲット要素が指定した条件を満たすと、コールバック関数が呼ばれます。これが便利で、パフォーマンスにも優れた仕組みなんです。
主なプロパティやメソッド
IntersectionObserver
:監視を開始するためのインスタンスを作るコンストラクタobserve()
:監視対象の要素を指定するunobserve()
:監視を停止するdisconnect()
:監視そのものを解除する
これを使えば、スクロールイベントの頻繁な発火を防げて、ページのパフォーマンスが改善されるんですよ。
2. スクロールアニメーションの実装方法
じゃあ、実際にスクロールアニメーションを作ってみましょう!今回は、ページをスクロールしたときに、特定の要素が表示されるとフェードインするアニメーションを作ります。
監視対象を決めて、設定をしよう
まず、スクロールでアニメーションを発動させたい要素をHTMLで定義します。今回はシンプルにこんな感じで書いてみました。
<div class="fade-in-element">
スクロールで表示されるコンテンツ
</div>
次に、JavaScriptでこの要素を監視します。
const observer = new IntersectionObserver(callback, options);
const target = document.querySelector('.fade-in-element');
observer.observe(target);
ここでは、callback
が監視対象の要素が指定した条件を満たしたときに実行される関数です。条件は、たとえば「50%画面に表示されたら」などです。
コールバック関数を作ろう
スクロールで要素が画面に現れると、アニメーションを始めたいですよね?そのために、Intersection Observerのcallback
関数を作成します。
const callback = (entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('fade-in');
observer.unobserve(entry.target);
}
});
};
このように、要素がビューポートに現れたら、fade-in
クラスを追加して、アニメーションを発動させます。
CSSでアニメーションを定義しよう
そして、CSSでアニメーションを設定します。今回は、フェードインするアニメーションを作ってみました。
.fade-in {
opacity: 1;
transition: opacity 1s ease-in-out;
}
.fade-in-element {
opacity: 0;
}
これで、スクロール時に要素が50%見えたら、フェードインするアニメーションが始まります。
3. 実践例: フェードインアニメーションを作ってみよう
次に、実際にスクロールアニメーションを試してみます!下記のHTMLとJavaScriptを使って、実際に動かしてみてください。
HTMLとCSSの準備
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>スクロールアニメーション</title>
<style>
.fade-in {
opacity: 1;
transition: opacity 1s ease-in-out;
}
.fade-in-element {
opacity: 0;
}
.container {
height: 2000px;
}
</style>
</head>
<body>
<div class="container">
<div class="fade-in-element">
ここがスクロールで表示される部分です。
</div>
</div>
<script src="script.js"></script>
</body>
</html>
JavaScriptによるIntersection Observerの設定
const observer = new IntersectionObserver(callback, { threshold: 0.5 });
const target = document.querySelector('.fade-in-element');
observer.observe(target);
const callback = (entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('fade-in');
observer.unobserve(entry.target);
}
});
};
これで、スクロールしてきたときに要素が50%見えるとフェードインアニメーションが発動します。
4. パフォーマンス最適化のコツ
Intersection Observerを使う最大のメリットは、パフォーマンスが向上することです。ですが、いくつかのポイントを抑えておくと、さらに効率的に使えるので、チェックしておきましょう。
適切なrootMargin
とthreshold
を設定
スクロールアニメーションが発動するタイミングをうまく調整するために、rootMargin
やthreshold
を適切に設定しましょう。たとえば、rootMargin
を使うと、ビューポートの境界を調整できるので、少し早めにアニメーションが発動するようにすることもできます。
監視が不要になったら解除する
不要になった監視は必ず解除しましょう。これを怠ると、メモリの無駄遣いになってしまいます。
observer.unobserve(entry.target);
5. まとめ
Intersection Observer APIを使うと、スクロールアニメーションがとても簡単に実装でき、しかもページのパフォーマンスも改善されます。最初は少し手間に感じるかもしれませんが、慣れるとかなり便利で、さまざまな場面で活用できるので、ぜひ試してみてください。