【CSS+JS】現在のスクロール量を確実に取得する(プロパティ対応状況まとめ)

はじめに

JavaScriptで現在のスクロール量を取得するためのプロパティはたくさんあります。種類がありすぎるため、かえってどれを使えばいいのかいまいちわからないという人も多いかと思います。

本記事では、各プロパティのブラウザ対応状況まとめと、現在のスクロール量を確実に取得する方法について説明します。

スクロール量を取得するプロパティ一覧

スクロール量を取得するプロパティ一覧とブラウザの対応状況は以下の通りです。window.pageYOffsetwindow.scrollYのエイリアスなので対応状況はまったく同じです。

プロパティ名
window.scrollY ×
window.pageYOffset ×
document.body.scrollTop × × × ×
document.documentElement.scrollTop ×
document.scrollingElement.scrollTop ×

最新の対応状況はMDNで確認できます。

スクロール量を確実に取得する

現在の対応状況は上記の通りですが、将来もこの対応状況が続くことはないでしょう。実際、Chromeがバージョン60からバージョン61になったときに、対応するプロパティがガラッと変更されたという前例があります。

しかし、各ブラウザの対応状況が変更されるたびに修正するのは非常に大変です。そもそもブラウザがバージョンアップするたびに対応状況を確認することすら現実的ではありません。

そこで、以下のような関数を作ることで、どのプロパティが対応しているのかを気にすることなくスクロール量を取得できるようになります。

const getScrollTop = () => {
  return Math.max(
    window.scrollY,
    window.pageYOffset,
    document.body.scrollTop,
    document.documentElement.scrollTop,
    document.scrollingElement.scrollTop
  );
}

各プロパティのうち、取得できたものの中から最大値を返す関数です。この関数を呼び出すことで確実にスクロール量を取得することができます。window.pageYOffsetwindow.scrollYのエイリアスにすぎませんが、一応入れています。

まとめ

現在のスクロール量を確実に取得する方法については昔から議論されてきたようで、上記の方法以外にも|| (OR)を使った方法や三項演算子を使った方法などがあります。しかし、各プロパティのブラウザ対応状況までをきちんとまとめている記事はないようだったので、備忘も含めてまとめてみました。

本記事を参考にしていただければと思います。

関連記事

【JavaScript】スプレッド構文
# はじめに スプレッド構文は、JavaScriptでデータを展開する際に非常に便利な機能です。JavaScriptにおけるスプレッド構文の基本的な使い方とその応用について説明します。 # スプレッド構文の基本 スプレッド構文は、配列やオ [...]
2024年8月7日 10:57
【JavaScript】||(論理和演算子)と??(Nullish Coalescing演算子)の違い
# はじめに JavaScriptでの`||`(論理和演算子)と`??`(Nullish Coalescing演算子)は、どちらも値を選択する際に使われる演算子ですが、それぞれの動作には重要な違いがあります。 # ||(論理和演算子) ` [...]
2024年8月1日 10:58
【JavaScript】3種類の変数宣言
# はじめに JavaScriptには、`var`,`let`,`const`という3種類の変数宣言方法があります。これらは、それぞれ異なる特性と用途を持っています。以下に、それぞれの違いを説明します。 # var ## スコープ [...]
2024年7月30日 12:48
【JavaScript】4種類の関数とそれぞれの特性・使い所
# はじめに JavaScriptの関数は、コードの再利用やモジュール化を実現するための基本的な要素です。関数は、プログラムの複雑さを管理しやすくし、コードの可読性と保守性を向上させます。 JavaScriptには、いくつかの異なる方法で関 [...]
2024年7月30日 12:19
【JavaScript】「名前付きエクスポート/インポート」と「デフォルトエクスポート/インポート」
# はじめに JavaScriptのエクスポートは、モジュールを使用してコードを分割し、再利用可能にするための重要な概念です。エクスポートを利用することで、他のファイルから関数や変数、クラスをインポートして使用することができます。 Java [...]
2024年7月30日 11:46
【CSS+JS】メニューアイコンの一種、ベントーメニューの実装方法(アニメーション付き)
# はじめに メニューアイコンの中ではハンバーガーメニューが有名だと思いますが、その他にもいろいろな種類があって、それぞれに名前もつけられています。 <a class="gallery" data-group="gallery" href= [...]
2021年10月18日 14:26
【CSS+JS】メインコンテンツの裏から現れるフッターの実装方法
# はじめに オシャレなサイトなどでたまに見かける「メインコンテンツの裏から現れるフッター」の実装方法について説明します。 # サンプル <iframe height="392" style="width: 100%;" scrollin [...]
2021年10月18日 13:26
【CSS+JS】背景画像の視差効果(パララックス)を実装する方法
# はじめに JavaScriptプラグインを使わずに、背景画像の視差効果(パララックス)をVanilla JS(ピュアなJavaScript)だけで実装する方法について説明します。 # サンプル まず、背景画像の視差効果(パララックス) [...]
2021年10月17日 12:08