JavaScript:ブラウザウィンドウが下にスクロールされたかどうかを検出する方法


187

ユーザーがページの一番下までスクロールされたかどうかを検出する必要があります。ページの下部にある場合、新しいコンテンツを下部に追加すると、自動的に新しい下部にスクロールされます。一番下にない場合は、ページの前のコンテンツを読んでいるので、現在の場所にとどまりたいので、自動スクロールしたくありません。

ユーザーがページの一番下までスクロールされたかどうか、またはページの上でスクロールされたかどうかをどのように検出できますか?


1
> stackoverflow.com/a/42547136/621951 -この1は角度6で働いている
GünayGültekin

回答:


268
window.onscroll = function(ev) {
    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
        // you're at the bottom of the page
    }
};

デモを見る


29
html / body要素が100%に設定されている場合(ボディがビューポート全体の高さを満たすように)は機能しません
Grodriguez

5
IEのdocument.documentElement.scrollTop代わりに使用しwindow.scrollYます。IEのどのバージョンがサポートされてwindow.scrollYいるかは不明です。
Batandwa 2014年

3
基本OS 0.3.2(64ビット)で実行されているUbuntu 14.04で構築されたChromiumバージョン47.0.2526.73では機能しません
K-SOの毒性が増加しています。

9
offsetHeightの代わりにdocument.body.scrollHeightを使用しました(私の場合、offsetHeightは常にwindow.innerHeightよりも小さかった)
Oliver

1
@KarlMorrisonは、ブラウザで賞金を獲得した回答(@Dekel)を試すことができますか?
Basj

115

すべての主要なブラウザーサポートのコードを更新(IE10およびIE11を含む)

window.onscroll = function(ev) {
    if ((window.innerHeight + window.pageYOffset) >= document.body.offsetHeight) {
        alert("you're at the bottom of the page");
    }
};

現在受け入れられている答えの問題は、 window.scrollY IEでは利用できないことです。

ここからの引用であるMDN scrollYについては:

ブラウザ間の互換性のために、window.scrollYの代わりにwindow.pageYOffsetを使用してください。

そして実用的なスニペット:

Macに関する注意

@Raphaëlのコメントに基づくと、オフセットが小さいためMacに問題がありました。
次の更新された条件が機能します。

(window.innerHeight + window.pageYOffset) >= document.body.offsetHeight - 2

私はそれをさらにテストする機会がありませんでした、誰かがこの特定の問題についてコメントできればそれは素晴らしいでしょう。


FF、Chrome、IE10、Chrome for Androidでの動作を確認しました。@Dekelありがとうございます!
Basj

2
奇妙に聞こえるかもしれませんが、私のブラウザでのみ1ピクセルに満たないため、条件がトリガーされません。理由は不明ですが、機能させるために数ピクセルを追加する必要がありました。
Sharjeel Ahmed 2017

3
(〜1ピクセル)小さなオフセットの我々はそうのような条件を更新しましたので、Macコンピュータ上で、以下の条件が満たされていない(window.innerHeight + window.pageYOffset) >= document.body.offsetHeight - 2
ラファエル

4
thx @Dekel!実際には、window.pageYOffsetがMacのフロートであることがわかります。最終的な解決策は(window.innerHeight + Math.ceil(window.pageYOffset + 1)) >= document.body.offsetHeightです。
ラファエル

2
ボディの高さが100%に設定されているスタイルの場合は機能しません
raRaRa

56

受け入れられた答えは私にとってはうまくいきませんでした。これはしました:

window.onscroll = function(ev) {
    if ((window.innerHeight + window.scrollY) >= document.body.scrollHeight) {
      // you're at the bottom of the page
      console.log("Bottom of page");
    }
};

古いブラウザ(IE9)のサポートを検討している場合は、サポートwindow.pageYOffsetが少し優れているエイリアスを使用してください。


1
IE10 / 11では機能しません。IEサポートについては、Dekelの回答(stackoverflow.com/questions/9439725/…)を確認してください。私のために働いた
Herr_Schwabullek

ページの下部にいるときだけでなく、スクロールするたびに他の回答がconsole.log()をトリガーしました。この答えはChromeでうまくいきました。
Defcronyke 2017

ieまたはedgeで機能しないwindow.scrollYを取り除く場合、これは適切な答えです。置き換え:(window.innerHeight + window.pageYOffset)> = document.body.scrollHeight
colemerrick

21

答えを探していましたが、正確な答えが見つかりませんでした。この回答の時点で最新のFirefox、IE、Chromeで動作する純粋なJavaScriptソリューションを次に示します。

// document.body.scrollTop alone should do the job but that actually works only in case of Chrome.
// With IE and Firefox it also works sometimes (seemingly with very simple pages where you have
// only a <pre> or something like that) but I don't know when. This hack seems to work always.
var scrollTop = (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop;

// Grodriguez's fix for scrollHeight:
// accounting for cases where html/body are set to height:100%
var scrollHeight = (document.documentElement && document.documentElement.scrollHeight) || document.body.scrollHeight;

// >= is needed because if the horizontal scrollbar is visible then window.innerHeight includes
// it and in that case the left side of the equation is somewhat greater.
var scrolledToBottom = (scrollTop + window.innerHeight) >= scrollHeight;

// As a bonus: how to scroll to the bottom programmatically by keeping the horizontal scrollpos:
// Since window.innerHeight includes the height of the horizontal scrollbar when it is visible
// the correct vertical scrollTop would be
// scrollHeight-window.innerHeight+sizeof(horizontal_scrollbar)
// Since we don't know the visibility/size of the horizontal scrollbar
// we scroll to scrollHeight that exceeds the value of the
// desired scrollTop but it seems to scroll to the bottom with all browsers
// without problems even when the horizontal scrollbar is visible.
var scrollLeft = (document.documentElement && document.documentElement.scrollLeft) || document.body.scrollLeft;
window.scrollTo(scrollLeft, scrollHeight);

4
これはほとんど問題なく機能しましたが、html / bodyが高さ100%に設定されている場合を考慮する((document.documentElement && document.documentElement.scrollHeight) || document.body.scrollHeight)だけでなく、使用document.body.scrollHeightする必要がありました
Grodriguez

1
@Grodriguez情報ありがとうございます!将来的に重宝するかもしれません!:-)
pasztorpisti 2014年

15

これは機能します

window.onscroll = function() {

    // @var int totalPageHeight
    var totalPageHeight = document.body.scrollHeight; 

    // @var int scrollPoint
    var scrollPoint = window.scrollY + window.innerHeight;

    // check if we hit the bottom of the page
    if(scrollPoint >= totalPageHeight)
    {
        console.log("at the bottom");
    }
}

古いブラウザー(IE9)をサポートする場合は、window.scrollYwindow.pageYOffsetに置き換えます。


1
これは2019年に反応します。ボディは100%の高さで動作し、html 100%の高さで価値があります。Chrome、Safari、Firefox、Edgeで動作します。
怒ったキウイ

ただ注意:ネーミングは変更する必要があります-変​​数を切り替える必要があります。scrollHeightはページ全体の高さを示し、totalHeightは現在のスクロールポイントを示すため、少し混乱します。
Vladimir Marton

4

私はこれを見始めたばかりであり、ここでの答えは私を助けてくれたので、ありがとう。コードがIE7まで完全に安全になるように、少し拡張しました。

これが誰かにとって役立つことを願っています。

ここにフィドルがあります;)

    <!DOCTYPE html>
<html>
<head>
    <style>
        div {
            height: 100px;
            border-bottom: 1px solid #ddd;
        }

        div:nth-child(even) {
            background: #CCC
        }

        div:nth-child(odd) {
            background: #FFF
        }

    </style>
</head>

<body>
<div></div><div></div><div></div><div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div><div></div><div></div><div></div>
<div></div><div></div><div></div><div></div><div></div><div></div><div></div>
</body>

<script type="text/javascript">
console.log("Doc Height = " + document.body.offsetHeight);
console.log("win Height = " + document.documentElement.clientHeight);
window.onscroll = function (ev) {
    var docHeight = document.body.offsetHeight;
    docHeight = docHeight == undefined ? window.document.documentElement.scrollHeight : docHeight;

    var winheight = window.innerHeight;
    winheight = winheight == undefined ? document.documentElement.clientHeight : winheight;

    var scrollpoint = window.scrollY;
    scrollpoint = scrollpoint == undefined ? window.document.documentElement.scrollTop : scrollpoint;

    if ((scrollpoint + winheight) >= docHeight) {
        alert("you're at the bottom");
    }
};
</script>
</html>

一種の作品。しかし、それはあまり正確ではありません。下部から約16ピクセル以内にある限り、下部にスクロールされていると見なされます。
Peter Hall

4

height: 100%コンテナを設定している<div id="wrapper">場合は、次のコードが機能します(Chromeでテスト済み)。

var wrapper = document.getElementById('wrapper');

wrapper.onscroll = function (evt) {
  if (wrapper.scrollTop + window.innerHeight >= wrapper.scrollHeight) {
    console.log('reached bottom!');
  }
}

3
window.onscroll = function(ev) {
    if ((window.innerHeight + Math.ceil(window.pageYOffset)) >= document.body.offsetHeight) {
        alert("you're at the bottom of the page");
    }
};

この回答は、エッジケースを修正します、これがされているためpageYOffsetであるdouble間、innerHeightそして offsetHeightありますlong、ブラウザはあなたに情報を与えるときに、あなたはピクセル短くてもよいです。例:ページの下部にある

本当 window.innerHeight = 10.2

本当 window.pageYOffset = 5.4

本当 document.body.offsetHeight = 15.6

その場合、計算は次のようになります:10 + 5.4> = 16これは 偽です

これを修正するMath.ceilには、pageYOffset値でます。

お役に立てば幸いです。


3

あなたがjqueryを愛しているなら

$(window).scroll(function() {
  if($(window).scrollTop() + $(window).height() >= $(document).height()) {
    // doSomethingHere();
  }
});

そして、jQueryを好きではない人…
Josh Habdas

2
@JoshHabdasブラウザ
Toni Michel Caubet

2

jqueryの無限スクロールを調べることができます。

http://www.infinite-scroll.com/infinite-scroll-jquery-plugin/

jqueryライブラリーを使用するつもりで、厳密な純粋なJSメソッドを期待していない場合、それはあなたが望んでいることを行うように聞こえます。


2
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
bobthedeveloper 2014年

@Hatsjoem彼はプラグインにリンクしています。正確にコピーする必要がある「必須部分」は何ですか?「リンクされたページが変更された場合に無効になる」という答えが気になりますか?リンクが壊れた場合、それはプラグインが廃止されて存在しないことを意味します-回答にさらに情報を追加しても、それは依然として無効です。リンクのみの回答は必ずしも悪いわけではありません。
dcastro 2014年

@Hatsjoemまた、メタから:「参照されたライブラリがよく知られている安定した場所にある場合、この種の回答は一般的に貧弱な回答ですが、それでも「これを使用する」と答えます。」
dcastro 2014年

さらに、無限スクロールがこのURLを変更しても、googleはおそらく存在し続けます。重要なのは、そのプラグインを使用することです。リンクが停止した場合は、Google検索jqueryの無限スクロールを実行するだけです。あなたはおそらくあなたが必要なものを見つけるでしょう。
Kai Qing

2

驚いたことに、私にとって有効な解決策はありませんでした。それは私cssがめちゃくちゃになっていて、body使用時にすべてのコンテンツをラップしなかったためだと思いますheight: 100%(まだ理由がわからない)。しかし、解決策を探している間、私はうまく何かを思いついた...基本的に同じですが、多分それを見る価値があります-プログラミングに慣れていないので、同じことをもっと遅い、サポートされていない、または何かのような場合は申し訳ありませんそれ...

window.onscroll = function(evt) {
  var check = (Element.getBoundingClientRect().bottom - window.innerHeight <= 0) ? true : false;
  if (check) { console.log("You're at the bottom!"); }
};

2
$(document).ready(function(){
    $('.NameOfYourDiv').on('scroll',chk_scroll);
});

function chk_scroll(e)
{
    var elem = $(e.currentTarget);
    if (elem[0].scrollHeight - elem.scrollTop() == elem.outerHeight()) 
    {
        alert("scrolled to the bottom");
    }

}

idk別の視点。しかし、受け入れられた答えは確かにより良い
Zihan Zhang

2
const handleScroll = () => {
    if (Math.round(window.scrollY + window.innerHeight) >= Math.round(document.body.scrollHeight)) {
        onScroll();
    }
};

このコードは、FirefoxとIEでも機能しました。


1

機能コードスニペットの埋め込みを使用defaultViewdocumentElementて:

const { defaultView } = document;
const { documentElement } = document;
const handler = evt => requestAnimationFrame(() => {
  const hitBottom = (() => (defaultView.innerHeight + defaultView.pageYOffset) >= documentElement.offsetHeight)();
  hitBottom
    ? console.log('yep')
    : console.log('nope')
});
document.addEventListener('scroll', handler);
<pre style="height:110vh;background-color:fuchsia">scroll down</pre>


1

ウィンドウの高さとスクロール上部の合計結果が本体の結果よりも大きいかどうかを確認できます

if (window.innerHeight + window.scrollY >= document.body.scrollHeight) {}


0

正しいXPathがわからないコンポーネントを探すために、体系的に下にスクロールする方法(Javaで)を考え出す必要がありました(長い話なので、遊んでください)。先ほど述べたように、コンポーネントを探しながら下にスクロールし、コンポーネントが見つかったか、ページの下部に達したときに停止する必要がありました。

次のコードスニペットは、ページの下へのスクロールを制御します。

JavascriptExecutor js = (JavascriptExecutor) driver;
boolean found = false;
long currOffset = 0;
long oldOffset = 0;
do
{
    oldOffset = currOffset;
    // LOOP to seek the component using several xpath regexes removed
    js.executeScript("window.scrollBy(0, 100)");
    currOffset = (Long)js.executeScript("var offset = window.window.pageYOffset; return offset;");
} while (!found && (currOffset != oldOffset));

ちなみに、このコードスニペットが実行される前にウィンドウが最大化されます。


0

受け入れられた答えは私にとってはうまくいきませんでした。これはしました:

const element = document.createElement('div');
document.body.appendChild(element);
document.addEventListener('scroll', () => {
    const viewportHeight = window.innerHeight;
    const distance = element.getBoundingClientRect().top;
    if (Math.floor(distance) <= viewportHeight) {
        console.log('yep')
    } else {
        console.log('nope')
    }
})

0

私が見つけた2つの解決策は私のために働きました:

  window.addEventListener('scroll', function(e) {
    if (
      window.innerHeight + document.documentElement.scrollTop ===
      document.documentElement.offsetHeight
    ) {
      console.log('You are at the bottom')
    }
  })

そして他の:

  window.addEventListener('scroll', function(e) {
    if (
      window.innerHeight + window.pageYOffset ===
      document.documentElement.offsetHeight
    ) {
      console.log('You are at the bottom')
    }
  })
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.