JavaScriptを使って「.animate」クラスを指定した要素を、ビューポート内に入ったら「下からふわっと出現」させる方法を解説します。
目次
HTML
以下のように「.animate」クラスを付与したHTMLを用意します。複数の要素を動かす場合は、クラス名「.animate」を複数の要素に追加するだけでOK
<div class="wrap animate">
ここに内容が入ります
</div>
JavaScript
ビューポート内に入った要素に「.animate-active」クラスを自動で追加するために、Intersection Observer APIを使用します。
document.addEventListener('DOMContentLoaded', function() {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('animate-active');
} else {
entry.target.classList.remove('animate-active');
}
});
}, {
threshold: 0.1
});
document.querySelectorAll('.animate').forEach(section => {
observer.observe(section);
});
});
コード解説
- DOMContentLoadedイベント:
- HTMLが完全に読み込まれた後に処理を開始。
- IntersectionObserverの作成:
IntersectionObserver
は、要素の可視性(見え具合)を監視するためのインスタンスです。- コールバック関数内で、監視対象要素がビューポート内に入ったかどうかをチェックします。
- entries.forEach(entry):
entries
は監視対象の要素リストです。- 各
entry
オブジェクトは、要素の可視性情報(isIntersectingなど)を持っています。
- isIntersecting:
- 要素がビューポート内に入った場合に
true
となります。 true
の場合はanimate-active
クラスを追加、false
の場合はクラスを削除。
- 要素がビューポート内に入った場合に
- threshold:
0.1
は監視対象要素の10%がビューポート内に入った時点でコールバックを実行する設定です。
- observer.observe():
.animate
クラスを持つ全ての要素を監視対象として登録します。
Intersection Observer APIとは?
Intersection Observer APIは、要素がビューポート内(画面内)に入ったかどうか、またその割合を監視するためのWeb APIです。このAPIを使うと、スクロールに応じた動的なアニメーションやコンテンツの遅延読み込み(Lazy Loading)を簡単に実現できます。
主な特徴
- パフォーマンス向上: スクロールイベントを直接扱わないため、処理の負荷を軽減。
- 柔軟性: ビューポート内に入ったしきい値を自由に設定可能。
- 使いやすさ: 対象の要素を監視し、コールバック関数で処理を記述するシンプルな設計。
CSS
アニメーションの基本的な動作を定義します。下記のスタイルで「下からふわっと出現する動き」を実現できます。
/* 遅延アニメーション */
.animate {
opacity: 0;
transform: translateY(50px);
transition:
opacity 1s ease-out,
transform 1s ease-out;
}
.animate-active {
opacity: 1;
transform: translateY(0);
}
ポイント
opacity
: 表示の透明度を指定します。transform: translateY
: 初期状態では50px下に移動。ビューポートに入ったら元の位置に戻ります。transition
: 動きの内容と時間の配分を指定。
まとめ
この方法を使うと、アニメーションを簡単に実現できると同時に、Intersection Observer APIで高機能なロードを担保できます。
デザインの向上やユーザーエンゲージの実現にも最適な手段です。
これからも勉強しながら、楽しく開発するぞー!
コメント