目次
はじめに
以下の記事では、ライブラリ「jquery.inview」を用いて、画面内の要素を監視する方法を紹介しています。
本ライブラリはscrollイベントを使用しており、スクロール位置を都度監視をするため、多少負荷がかかります。
そこで、IntersectionObserverを使用し、要素が画面に入ったかどうかを効率的に監視します。
この記事では、この方法について説明します。
完成イメージ
すし

target my-left
ざん

target my-center
まい

target my-right
実装手順
以下の手順で実装します。
- ラベルGutenbergエディターでの設定

Gutenbergエディター 完成イメージを例に、以下の手順で作成します。
- 「3カラム」ブロックを配置します。
- アニメーションするブロックの高度な設定→追加CSSクラスに
targetと入力します。 - 各ブロックのアニメーション動作に応じて、高度な設定→追加CSSクラスに
my-left、my-center、my-rightを追加入力します。
- ラベルJavaScriptを追加(画面監視用)
以下のコードをjavascript.jsに追加します。
画面に表示されたブロック(target)に、CSSクラスis-activeが付加されます。/** * IntersectionObserverを使用して要素の画面内交差を監視し、画面内に入った際にアクティブクラスを付与 * * @param {string} targetSelector - 監視対象とする要素のCSSセレクタ * @param {string} activeClass - 要素が画面内に入った際に追加するクラス名 * @param {IntersectionObserverInit} [options] - IntersectionObserverの設定オプション(省略可) */ const observeElements = (targetSelector, activeClass, options) => { // 監視対象となるすべての要素を取得 const elms = document.querySelectorAll(targetSelector); // 要素の状態を監視 const observer = new IntersectionObserver((entries) => { // 監視している要素を1つずつ処理 entries.forEach((entry) => { // 要素が画面内に入った場合 if (entry.isIntersecting) { entry.target.classList.add(activeClass); // 一度アニメーションした要素は監視対象から削除 observer.unobserve(entry.target); } }); }, options); // 取得した各要素に対して監視を開始 elms.forEach((elm) => observer.observe(elm)); }; // DOMが完全に読み込まれたときに実行 document.addEventListener('DOMContentLoaded', function () { observeElements( '.target', 'is-active', { threshold: 0.2 } ); });
アニメーション対象の要素を
target以外にしたい場合は、複数のクラスをカンマ区切りで指定することも可能です。// DOMが完全に読み込まれたときに実行 document.addEventListener('DOMContentLoaded', function () { observeElements( '.my-left, .my-center, .my-right', // 監視対象とする複数の要素のCSSセレクタ 'is-active', // 画面内に入った際に追加するアクティブクラス名 'is-finished', // アニメーション完了後に追加するクラス名 { threshold: 0.2 } // 要素が20%見えたタイミングで発火させるためのオプション ); }); - ラベルCSSを追加
以下のコードをstyle.cssに追加します。
/* アニメーション対象 */ .my-left, .my-center, .my-right { opacity: 0; transform: translateY(100px); &.is-active { animation-duration: 1.8s; animation-fill-mode: forwards; animation-name: fadeInUp; } } .my-center { animation-delay: 500ms; } .my-right { animation-delay: 1000ms; } @keyframes fadeInUp { 100% { opacity: 1; transform: translateY(0); } }
参考:他のアニメーションスタイル

fadeUp

fadeRight
完成イメージのアニメーション動作は、一例に過ぎません。
以下に他のアニメーション効果のCSSコードを示します。
/* 上に移動 */
.fadeUp {
opacity: 0;
transform: translate(0, 50px);
transition-duration: 2s;
transition-property: opacity, transform;
&.is-active {
opacity: 1;
transform: translate(0, 0);
}
}
/* 右に移動 */
.fadeRight {
opacity: 0;
transform: translate(-50px, 0);
transition-duration: 2s;
transition-property: opacity, transform;
&.is-active {
opacity: 1;
transform: translate(0, 0);
}
}


