JavaScript PR

JavaScriptで簡単にスクロール位置を取得する

記事内に商品プロモーションを含む場合があります

webサイト作成時にスクロール位置の取得することが多いので、今後のために方法をまとめました。結論を先に書くとdocument.scrollingElementというプロパティがあるので、それを使いましょう。

スクロール位置を取得する

スクロール位置はscrollTopプロパティで取得と設定ができます。scrollTopで要素の最上部から下肢部分の最上部までの距離(ピクセル)を取得できます。スクロール位置を設定する時は値を代入します。下記ではhtml要素のスクロール位置を取得してます。

// html要素のスクロール位置を取得
console.log(document.documentElement.scrollTop);

ブラウザごとに使う要素が異なる

困ったことにスクロール位置を取得するときに使う要素がブラウザごとに違います。たとえばfirefoxではhtml要素のscrollTopでスクロール位置を取得することができますが、webkitであるsafariでは取得できず、body要素のscrollTopを取得しなければいけません。同じwebkitのchromeですが、バージョン61以降はhtml要素で取得できます。しかしchromeの古いバージョンではbody要素を使う必要があるのでブラウザ判定ができなくなります。

// safariやバージョン61より前のchrome
document.body.scrollTop 

// firefoxやバージョン61以降のchrome,ie,edgeなど
document.documentElement.scrollTop 

scrollingElementプロパティを使う

上に書いた問題のより良い解決策としてscrollingElementプロパティを使方法があります。scrollingElementとはdocumentのプロパティでdocumentのスクロール要素を取得することができます。しかも互換モードであればbody要素を、そうでない時にはhtml要素を取得できます。scrollingElementプロパティを使えばbody要素とhtml要素を分ける処理が不要になります。スクロール要素がない場合にはnullとなるようです。

// documentのスクロール要素取得
const scrollElement = document.scrollingElement;
// スクロール位置の取得 
const scrollTopValue = scrollElement.scrollTop; 

IEでは使えません

scrollingElementを使うことで万事解決かと思いきや、悲しいことにscrollingElementはIEで対応していません。IEも対応する場合にはscrollingElementがあるか確認するなどしてIEのみの処理をする必要があります。

const scrollElement = 'scrollingElement' in document
  ? document.scrollingElement
  : document.documentElement;

 

上記はdocumentにscrollingElementがあればscrollElementにdocument.scrollingElementを、そうでない時にはhtml要素を代入します。

スクロール位置を取得するときはscrollingElementを使いましょう

  • スクロール位置はscrollTopで取得する
  • スクロール位置を取得する時に使う要素はブラウザごとに違う
  • スクロール位置を取得する時に使う要素はscrollingElementで取得する
  • scrollingElementはIEのみ非対応である

スクロール位置はscrollTopプロパティから取得できるが、スクロールを取得する時に使う要素はbody要素であったり、html要素であったりブラウザごとに違う。scrollingElementプロパティを使うことでdocumentのスクロール要素を取得でき、ブラウザごとの処理が不要となる。ただしscrollingElementはIEのみ非対応である。