JavaScriptでスクロールバーの位置を取得する方法は?


188

JavaScriptを使用してブラウザーのスクロールバーの位置を検出し、現在のビューがページのどこにあるかを判断しようとしています。私の推測では、トラックの親指がどこにあるかを検出し、次に親指の高さをトラックの全高のパーセンテージとして検出する必要があります。私はそれを複雑にしていますか、それともJavaScriptはそれよりも簡単なソリューションを提供していますか?コード的にアイデアはありますか?

回答:


207

element.scrollTopおよびelement.scrollLeftを使用して、スクロールされた垂直オフセットと水平オフセットをそれぞれ取得できます。あなたがページ全体を気elementにするdocument.bodyならそうすることができます。パーセンテージが必要な場合は、(再度、本文である場合があります)element.offsetHeightと比較できます。element.offsetWidthelement


2
どのブラウザを使用していますか?本体は、異なるブラウザで異なる行なわ(されはじめelementdocument.body単なる例でした)。詳細については、howtocreate.co.uk / tutorials / javascript / browserwindowを参照してください。
Max Shawabkeh 2010年

8
Firefox 3.6で正しい値をwindow.pageYOffset取得するために取得しましたが、IE7では何も動作しません。試してみましたwindow.pageYOffsetdocument.body.scrollTopdocument.documentElement.scrollTopelement.scrollTop
ポール

1
scrollTopは、角かっこを追加したときにのみ機能しました... $( "。scrollBody")。scrollTop()
maia

9
「window」要素を処理している場合は、window.scrollTopの代わりにwindow.scrollYを使用できます
Janis Jansen

6
document.bodyほとんどの最新のブラウザではスクロール位置が設定されていないと思います-通常はdocument.documentElement現在設定されています。Chromeの移行については、bugs.chromium.org / p / chromium / issues / detail?id = 157855をご覧ください。
fzzfzzfzz

134

<div>Chromeでこれを行いました。

element .scrollTop-スクロールのために上部に隠されたピクセルです。スクロールしない場合、その値は0です。

element .scrollHeight -div全体のピクセルです。

element .clientHeight-ブラウザに表示されるピクセルです。

var a = element.scrollTop;

ポジションになります。

var b = element.scrollHeight - element.clientHeight;

scrollTop最大値になります

var c = a / b;

スクロールのパーセントになります[0から1まで]


ありがとう!おそらく0から1までではないでしょう。実際には要素の一番下までスクロールすることができないからです。

3
これはほぼ正しいです。var bの場合、element.clientHeightではなくwindow.innerHeightを減算する必要があります。
Kahless

51
document.getScroll = function() {
    if (window.pageYOffset != undefined) {
        return [pageXOffset, pageYOffset];
    } else {
        var sx, sy, d = document,
            r = d.documentElement,
            b = d.body;
        sx = r.scrollLeft || b.scrollLeft || 0;
        sy = r.scrollTop || b.scrollTop || 0;
        return [sx, sy];
    }
}

2つの整数の配列を返します-[scrollLeft、scrollTop]


4
この関数の使用方法を例とともに示すことは素晴らしいことです。
user18490 14

1
このlastscroll = getScroll();を使用できると思います。window.scrollTo(lastscroll [0]、lastscroll [1]);
Dinesh Rajan

うまくいきましたが、xキーとyキーを使用してオブジェクトへの戻りを変更しました。
xd6_

@ user18490のコメントに従って編集されました。
Davide

ReferenceError:変数が見つかりません:element
Jonny

32

こんな感じです :)

window.addEventListener("scroll", function (event) {
    var scroll = this.scrollY;
    console.log(scroll)
});

11

2018年の回答

このようなことを行う最良の方法は、Intersection Observer APIを使用することです。

Intersection Observer APIは、ターゲット要素と祖先要素またはトップレベルのドキュメントのビューポートとの交差の変化を非同期で監視する方法を提供します。

これまで、要素の可視性、または2つの要素の相対的な可視性を検出することは、ソリューションが信頼できず、ブラウザやユーザーがアクセスするサイトの動作が遅くなる傾向があったため、困難な作業でした。残念ながら、Webが成熟するにつれて、この種の情報の必要性が高まっています。交差点情報は、次のような多くの理由で必要です。

  • ページがスクロールされたときの画像やその他のコンテンツの遅延読み込み。
  • ユーザーがページをめくる必要がないように、スクロールに応じてより多くのコンテンツがロードおよびレンダリングされる「無限スクロール」Webサイトの実装。
  • 広告収入を計算するための広告の可視性のレポート。
  • ユーザーに結果が表示されるかどうかに基づいて、タスクまたはアニメーションプロセスを実行するかどうかを決定します。

過去に発生した交差検出の実装には、影響を受けるすべての要素に必要な情報を構築するために、Element.getBoundingClientRect()などのメソッドを呼び出すイベントハンドラーとループが含まれていました。このコードはすべてメインスレッドで実行されるため、これらのコードの1つでもパフォーマンスの問題を引き起こす可能性があります。サイトにこれらのテストが読み込まれると、事態は実に醜くなります。

次のコード例を参照してください。

var options = {
  root: document.querySelector('#scrollArea'),
  rootMargin: '0px',
  threshold: 1.0
}

var observer = new IntersectionObserver(callback, options);

var target = document.querySelector('#listItem');
observer.observe(target);

最新のブラウザのほとんどはIntersectionObserverをサポートしていますが、下位互換性のためにポリフィルを使用する必要があります。


8

ページ全体を気にする場合。あなたはこれを使うことができます:

document.body.getBoundingClientRect().top


1
代わりにdocument.bodyを使用してください
danial dezfouli

3

jQueryを使用している場合、完璧な関数があります:.scrollTop()

ここにドキュメント-> http://api.jquery.com/scrollTop/

注:この関数を使用して、位置を取得または設定できます。

参照:http : //api.jquery.com/?s=scroll


25
生のJSでそれを行うことが完全に可能で、便利な場合に、JSのライブラリでJSに関する質問に答えるのはなぜですか?あなたはただ彼にロード時間を追加するように頼むだけでなく、完全に不必要なもののためにいくつかのストレージを使い果たします。また、JavaScriptがJQueryを意味するようになったのはいつからですか。
DaemonOfTheWest

4
個別に質問した場合、jQueryは好きではなかったので、この質問には答えていませんが、バニラJSには他のフェローからの回答が既にあります。あなたはjQueryを使用しています)
Ravinder Payal

@ R01010010それは、今日のJQueryは役に立たず、逆効果であるからです。JQueryのすべての機能はVanilaJSを使用して簡単に実装できます。また、VanillsaJSで利用可能な新機能を使用して、JillerJSで利用できるようになります。 、今日では、古いXHRに取って代わるフェッチと呼ばれる新しいAPIがVanillaJSにあります。JQueryの世界にいるだけの場合、フェッチのメリットが見られず、jQuery.ajax()を使い続けることはありません。私の個人的な意見は、 JQueryを使用しているのは、彼らが学習をやめたからです。また、VanillaJSの方が高速ですvanilla-js.com
John Balvin Arias

@JohnBalvinAriasがフェッチについて話している、IE11やEdgeで何が起こっているのか?
ベン、

私が間違っている場合は修正してください。ただし、フェッチが「モダン」であるIEで適切に機能しないため、IEはまだ広く使用されています。私がjqueryを使用している場合、次に進むことはほとんど奨励されません
Ben

3

スクロール位置を取得する別の方法は次のとおりです

const getScrollPosition = (el = window) => ({
  x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
  y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
});

0

次の関数は、スクロール座標値を保持するのに役立ちます。

const getScrollCoordinate = (el = window) => ({
  x: el.pageXOffset || el.scrollLeft,
  y: el.pageYOffset || el.scrollTop,
});

私はこの答えから少し変更を加えてこのアイデアを得ました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.