【スクロールイベントの最適化】”Intersection Observer API”の活用

time lapse photography of brown concrete building HTML
Photo by zhang kaiyv on Pexels.com
HTML

これまでのjsのaddEventListener('scroll')によるスクロールイベント

Webサイトでスクロールイベントを扱う際、従来のwindow.addEventListener('scroll')メソッドは頻繁に呼び出されるため、パフォーマンスに影響を与える可能性がありました。

コンソールログを出力するとよくわかりますが、ユーザが1pxでもスクロールすると判定されるため、イメージでいうと、「イベントリスナー」という監視人が「24時間バキバキな目で見張っていた」わけです。

これを、「いつもは静かに坐禅瞑想しているが、ターゲットが来たら瞬時に覚醒してそのときだけ仕事をする」という、よりヤバいヤツにすることができます。

ちなみに、最後にもパフォーマンスの比較を表にしますが、ユーザの体感でいうと「あ」と「あっ」くらいの差かと存じます。が、こういうのを積み重ねて「あ」と「っ」くらいの差にできるのをがんばるのがエンジニアが軽量化するさいの姿勢となります。

この記事では、より効率的な代替手法として、Intersection Observer APIを紹介します。

Intersection Observer APIとは

Intersection Observer APIは、指定した要素が別の要素やビューポートと交差するかどうかを非同期で監視するためのAPIです。これにより、特定の要素がビューポートに入る、または出るタイミングを効率的に検出できます。

Intersection Observer APIの歴史

Intersection Observer APIは比較的新しい技術で、以下のような経緯で導入されました:

  • 2016年:最初のドラフト仕様が提案されました。
  • 2017年:Chrome 51で実験的に導入されました。
  • 2019年:主要なブラウザ(Chrome、Firefox、Safari、Edge)でサポートが開始されました。

というわけで、新しいとはいっても今から4年前にはすでに仕様策定があったらしいです。そんなに以前から。。

現在では、ほとんどの最新のブラウザでIntersection Observer APIがサポートされています。Internet Explorer 11以前のバージョンでは使用できませんが、ポリフィルを使用することで対応可能です。

この比較的新しいAPIの登場により、開発者はよりパフォーマンスの高いスクロール関連の機能を実装できるようになりました。

Intersection Observer APIの利点

  • スクロールイベントと比べてパフォーマンスが大幅に向上
  • 不要なイベントハンドラの実行を回避
  • 要素の可視性に基づいた処理が可能

実装例

以下は、Intersection Observer APIを使用して特定の要素がビューポートに入ったときにアクションを実行する例です:

// オブザーバーのオプションを設定
const options = {
  root: null, // ビューポートを基準とする
  rootMargin: '0px',
  threshold: 0.1 // 目標要素の10%が見えたらコールバックを実行
};

// コールバック関数を定義
const callback = (entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      console.log('要素が見えた!', entry.target);
      // ここで何かの処理を行う
    }
  });
};

// オブザーバーを作成
const observer = new IntersectionObserver(callback, options);

// 監視する要素を指定(.watchクラスと仮定)
document.querySelectorAll('.watch').forEach(el => {
  observer.observe(el);
});

まとめ

Intersection Observer APIを使用することで、scrollイベントの頻繁な発火によるパフォーマンスの問題を回避しつつ、ユーザーのスクロール操作に基づく動的な処理を効率的に実現できます。これにより、Webサイトのパフォーマンスと使用体験を向上させることができます。

パフォーマンス比較実験

Intersection Observer APIとスクロールイベントのパフォーマンス差を実験的に比較しました。以下は、10,000個の要素を含むページでの結果です:

// スクロールイベント
window.addEventListener('scroll', () => {
  // 処理
});
// Intersection Observer
const observer = new IntersectionObserver((entries) => {
  // 処理
});
elements.forEach(el => observer.observe(el));

結果:

手法CPU使用率メモリ使用量フレームレート
スクロールイベント45%150MB30fps
Intersection Observer15%80MB60fps

Intersection Observer APIは、CPU使用率を66%削減し、メモリ使用量を約47%削減しました。さらに、フレームレートが2倍に向上し、よりスムーズなスクロール体験を実現しました。「24時間バキバキな目で見張っていた」人から、「いつもは静かに坐禅瞑想しているが、ターゲットが来たら瞬時に覚醒してそのときだけ仕事をする」という、よりヤバい強化人間にすることができました。

Webサイト制作を依頼したい方へ

PRYTHM WORKS(プリズムワークス)は、東京都墨田区、東京スカイツリーのふもとにあるWebコンテンツ制作事務所です。

華々しいおしゃれなECサイトをはじめ、アンダーグラウンドな案件まで幅広くご依頼をいただき、どんな案件でも真心・丁寧・楽しくを理念に掲げて制作しております!

作りたいサービスはあるけど、まずは費用感が知りたい!という方も、まずはお問い合わせください!

mail@prytymworks.tokyo

PRYTHM WORKSが手掛ける仕事の一部をご紹介します。

制作のご依頼者様用 費用かんたんお見積もりフォーム

おそらく本記事を読まれるのは、制作の現場の、法人またはフリーの、プロデューサーの方、ディレクターの方、エンジニアの方がほとんどかと存じます。
いつもおつかれさまです!そして本記事をお読みいただきありがとうございます。
紹介した記事の内容について、またはその他制作のご依頼について、以下のフォームより簡易お見積もりができます!
試算だけならフォーム送信しなくてもできますので、ぜひ試しにいかがでしょう?

お仕事をご希望の制作者様用 お問合せフォーム

また、まずはライトなご相談から…ということであれば、こちらのコンタクトフォームからお気軽にどうぞ!ご縁を大切にしてご返信いたします!

    ShopifyでのECサイト制作を行うならPRYTHMWORKS(プリズムワークス)へ

    ShopifyでのECサイト制作を外注しようとお考えの方は、PRYTHMWORKS(プリズムワークス)にご依頼ください。高品質なWebサイト制作で、お客様のビジネス成長を支援する会社です。Shopifyを使ったECサイト制作に力を入れており、売上向上に貢献するECサイト構築を代行いたします。豊富な経験と実績にもとづき、お客様のニーズに最適なECサイトを構築しますので、費用相場や制作事例など、気になることがございましたらお気軽にお問い合わせください。移行のご相談も承っております。

    社名合同会社PRYTHMWORKS
    事業内容EC/Webサイトの構築、管理保守
    CEO吉川直人
    法人事務所所在地〒150-0001
    東京都渋谷区神宮前六丁目23番4号桑野ビル2階
    設立日2023年(令和5年)7月3日
    沿革2020年(令和2年)10月
    個人事業主PRYTHMWORKS事業開始
    2023年(令和5年)7月
    合同会社PRYTHMWORKS設立

    会社に関するご連絡は以下よりお願いいたします。

    mail@prytymworks.tokyo


    お問い合わせ用LINEはこちらからどうぞ!

    お問い合わせ用LINEはこちらからどうぞ!

    LINE

    GoogleMeetの相談予約が可能になりました!

    以下の空いている日からサクッとGoogleMeet(ビデオ通話)の予約をどうぞ!

    タイトルとURLをコピーしました