BLOG ブログ


2025.04.18 TECH

交差オブザーバーAPIと画像出現アニメーション

交差オブザーバーAPI(Intersection Observer API)とは、画面に任意の要素が出現したかどうかを監視してくれるAPIです。交差オブザーバーAPIを使うことで、要素に対して簡単に出現した際の動作を付けることができます。

今回は交差オブザーバーAPIを使いつつ、画像出現時のアニメーションを5パターン作ってみました。

交差オブザーバーAPI

次のように書きます。

const targetEl = document.querySelector('#targetEl')

const observer = new IntersectionObserver(callback, option)

observer.observe(targetEl)

targetElは監視する要素です。この要素が画面内に入ったとき、callbackが実行されます。

optionは次の3つが指定でき、省略可能です。

  • root …… targetが見えているかの基準となる枠。指定しない場合はブラウザのビューポートが使われる
  • rootMargin …… rootに付与するマージン。枠のサイズを拡縮できる
  • threshold …… targetがどれくらい枠の中に入ってきたらcallbackを実行するかを、0~1で指定する

今回は、目的の要素(.images-box_item)が画面内に入ってきたときにクラスを付けたいと思います。また、ある程度要素が画面に表示されてからcallbackを実行したいので、thresholdを指定します。

const targetEl = document.querySelectorAll(".images-box_item")

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add('is-show')
    } else {
      entry.target.classList.remove('is-show')
    }
  })
}, {
  threshold: .5
})

targetEl.forEach(element => {
  observer.observe(element)
})

「isIntersecting」を見ることで、要素が「画面内に入ったか」「画面外に出ていったのか」を判別可能です。画像が入ってきたときはクラスを追加し、出ていったときは外しています。

アニメーションを付ける

JSでクラスの付け外しはできたので、それではこれにアニメーションを指定していきましょう。

まず最初は、オーソドックスに「ぼやけながら表示されるやつ」を作ってみます。

スクロールしていくと、画像がぼやっと表示されるかと思います。画面から外れたときはクラスを外すので、何度かスクロールをするとその度に再表示されます。

opacityとfilter、scaleを用い、少し縮小しながら段々像を結ぶ感じにしてみました。おしゃれなサイトに良さそうですね。

次は「下からぼよんぼよんしながら出現するやつ」を作ってみましょう。

transitionの指定に「cubic-bezier」を使いました。これはベジェ曲線を用いて動きを指定するためのものなのですが、使う際はジェネレータを使うと分かりやすいです。

Cubic Bezier

もうちょっと動きを激しくしても面白いかもしれませんね。コミカルなサイトにどうでしょうか。

次は「スッ……、と表示されるやつ」です。

これは「mask-image」を使って実装しています。縦幅が画像の二倍あるマスクを用意し、0~50%を白、50%~100%を白から透明へのグラデーションにしました。.is-showクラスが付いたときは、「mask-position」の値を変更してマスクをずらしています。

では次に「ブラインドっぽいやつ」です。

ブラインドは「mask-image」と「linear-gradient」で実装していますが、通常gradientはアニメーションが効きません。しかし「@property」でカスタムプロパティを定義し、その値を変更することによってアニメーションが可能になります。

ここではブラインドの幅を「mask-size」で30pxとし、その範疇でグラデーションの白い部分を0%から100%にまで変化させています。

最後に、@propertyを複数定義して、「水面っぽいやつ」を作ってみました。

やっていることは、ひとつ前のものと大体同じです。「radial-gradient」で定義した複数のリングをマスクとして使い、@propertyで定義した変数を変動させることで動作させました。

ちょっとしたアクセントにどうでしょうか。

あとがき

今回は交差オブザーバーAPIを使ってアニメーションを実装しました。また、CSSのマスクや@propertyも組み合わせて使ってみました。

アイデア次第で色んな表現ができそうですね。


一覧に戻る


LATEST ARTICLE 最新の記事

CATEGORY カテゴリー