パッシブ リスナーを使用してスクロールのパフォーマンスを向上させる

タッチ イベント リスナーとホイール イベント リスナーは、ユーザー操作のトラッキングやカスタム スクロール エクスペリエンスの作成に役立ちますが、ページのスクロールが遅れることもあります。現在、ブラウザはイベント リスナーがスクロールをブロックするかどうかを把握できないため、リスナーの実行が完了するまで待ってからページをスクロールします。パッシブ イベント リスナーを使用すると、イベント リスナーがスクロールを阻止しないことを指定できるため、この問題を解決できます。

ブラウザの互換性

ほとんどのブラウザは Passive Event Listener をサポートしています。ブラウザの互換性をご覧ください。

Lighthouse の Passive Event Listener 監査が失敗する仕組み

Lighthouse は、ページのスクロールが遅れる可能性があるイベント リスナーを報告します。

Lighthouse の監査で、ページでスクロール パフォーマンスを高める受動的なイベント リスナーが使用されていないことが示されている

Lighthouse では、次のプロセスを使用して、スクロール パフォーマンスに影響する可能性があるイベント リスナーを特定します。

  1. ページ上のイベントリスナをすべて検出する。
  2. タップまたはホイール以外のリスナを除外する。
  3. preventDefault() を呼び出すリスナーを除外する。
  4. ページとホストが異なるリスナを除外する。

Lighthouse では、別のホスト上のスクリプトは制御不可能とみなされるため、ホストが異なるリスナは除外されます。サードパーティのスクリプトがページのスクロール パフォーマンスに悪影響を及ぼしていたとしても、それらのスクリプトは Lighthouse のレポートには表示されません。

イベント リスナーを非アクティブにしてスクロール パフォーマンスを改善する方法

Lighthouse で特定されたすべてのイベント リスナーに passive フラグを追加します。

Passive Event Listener をサポートするブラウザのみをサポートする場合は、フラグを追加するだけです。次に例を示します。

document.addEventListener('touchstart', onTouchStart, {passive: true});

Passive Event Listener に対応していない古いブラウザをサポートしている場合は、機能検出またはポリフィルを使用する必要があります。詳しくは、WICG のパッシブ イベント リスナーに関する説明ドキュメントの特徴検出セクションをご覧ください。

リソース