Javascript: Як визначити, чи вікно браузера прокручується донизу?


187

Мені потрібно виявити, чи користувач прокручується внизу сторінки. Якщо вони знаходяться внизу сторінки, коли я додаю новий вміст донизу, я автоматично прокручую їх до нового дна. Якщо вони не знаходяться внизу, вони читають попередній вміст вище на сторінці, тому я не хочу автоматично прокручувати їх, оскільки вони хочуть залишитися там, де вони є.

Як я можу визначити, чи користувач прокручується внизу сторінки чи він прокручується вище на сторінці?


1
Ця робота працює в кутовій 6 -> stackoverflow.com/a/42547136/621951
Günay Gültekin

Відповіді:


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

Дивіться демонстрацію


29
Не працює, якщо html / елементи тіла встановлені на 100% (щоб тіло заповнило всю висоту огляду)
Grodriguez

5
Використовуйте document.documentElement.scrollTopзамість window.scrollYIE. Не впевнені, які, якщо такі є, підтримують версії IE window.scrollY.
Батандва

3
Не працює у версії Chromium 47.0.2526.73 Вбудований на Ubuntu 14.04, працює на елементарній ОС 0.3.2 (64-розрядна)
K - Токсичність в SO зростає.

9
Я використовував document.body.scrollHeight замість offsetHeight (у моєму випадку, offsetHeight завжди був меншим, ніж window.innerHeight)
Олівер,

1
@KarlMorrison чи можете ви спробувати відповідь, отриману щедрою (від @Dekel), у своєму браузері?
Баш

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.pageYOffset замість window.scrollY.

І робочий фрагмент:

Примітка для Mac

На основі коментаря @ Raphaël, в mac виникла проблема через невеликий зсув.
Наступна оновлена ​​умова працює:

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

У мене не було можливості перевірити це далі, якщо хтось може прокоментувати цю конкретну проблему, це буде здорово.


Підтверджено роботу над FF, Chrome, IE10, Chrome для Android. Дякую @Dekel!
Бась

2
Як не дивно це звучить, лише в моєму браузері мені не вистачає 1 пікселя, а значить, умова не спрацьовує. Не знаю чому, довелося додати зайвих кількох пікселів, щоб він працював.
Шарджіл Ахмед

3
на комп’ютерах Mac, умова нижче не виконується через невеликий зсув (~ 1px), ми оновили умову так(window.innerHeight + window.pageYOffset) >= document.body.offsetHeight - 2
Raphaël

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. Перевірте відповідь Dekel ( stackoverflow.com/questions/9439725/… ) щодо підтримки IE. Працював для мене
Herr_Schwabullek

Інші відповіді спрацьовували console.log () щоразу, коли я прокручувався, а не лише тоді, коли я знаходився внизу сторінки. Ця відповідь працювала для мене в Chrome.
Defcronyke

Якщо ви позбудетеся від window.scrollY, який не працює в ie або edge, це гідна відповідь. Замініть на: (window.innerHeight + window.pageYOffset)> = document.body.scrollHeight
colemerrick

21

Я шукав відповідь, але не знайшов точної. Ось чисте рішення JavaScript, яке працює з останніми Firefox, IE та Chrome на момент отримання відповіді:

// 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
Це майже працювало для мене, але мені довелося використовувати ((document.documentElement && document.documentElement.scrollHeight) || document.body.scrollHeight)замість того, document.body.scrollHeightщоб просто враховувати випадки, коли html / body встановлюється на висоту: 100%
Grodriguez

1
@Grodriguez Дякую за інформацію! Це може стати нам корисним у майбутньому! :-)
pasztorpisti

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.scrollY на window.pageYOffset


1
ця робота з реагуванням у 2019 році. робота з тілом 100% висоти, варто з html 100% висоти. робота з хромом, сафарі, фаєрфокс, край.
сердитий ківі

Лише зауваження: називання має бути змінено - змінні повинні бути переключені. Оскільки scrollHeight показує загальну висоту сторінки, а totalHeight показує поточну точку прокрутки, тому це трохи заплутано.
Володимир Мартон

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 пікс.
Пітер Хол

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вартості.

Сподіваюся, що це допомагає.



2

Ви можете заглянути в нескінченну прокрутку jquery:

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

Що звучить так, що це робить те, про що ви просите, припускаючи, що ви готові використовувати бібліотеку jquery і не сподіваєтесь на суворий чистий метод JS.


2
Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
bobthedeveloper

@Hatsjoem Він посилається на плагін. Що саме є "істотними частинами", які слід скопіювати? Кого хвилює, якщо відповідь "стає недійсною, якщо пов’язана сторінка зміниться"? Якщо посилання буде розірвано, це означає, що плагін був припинений і більше не існує - навіть якщо ви додасте більше інформації у відповідь, він все одно буде недійсним. Боже, відповіді лише на посилання не обов'язково погані.
дкастро

@Hatsjoem Також з мета : "Коли бібліотека, на яку посилається, знаходиться у відомій, стабільній локації, такий варіант відповіді, як правило, невдалий, але відповідь, тим не менше : він говорить" використати це ".
дкастро

Крім того, Google, ймовірно, все ще буде існувати, якщо нескінченна прокрутка змінить цю URL-адресу. Сенс у тому, щоб використовувати цей плагін, тому якщо посилання вмирає, просто google search jquery нескінченна прокрутка. Ви, мабуть, знайдете те, що вам потрібно.
Кай Цін

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 інша перспектива. Але прийнята відповідь краще напевно
Зіхан Чжан

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

Цей код працював для мене і в Firefox та IE.


1

Використання defaultViewта documentElementвбудований фрагмент функціонального коду:

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

Мені довелося придумати спосіб (на Java) систематично прокручувати вниз, шукаючи компонент, для якого я не знав правильного XPath (довга історія, тому просто пограйте). Як я вже нещодавно заявив, мені потрібно було прокручувати вниз, шукаючи компонент, і зупинятись, коли компонент був знайдений або досягнуто нижньої частини сторінки.

Наступний фрагмент коду керує прокруткою донизу сторінки:

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

Я знайшов два рішення, які працювали на мене:

  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')
    }
  })
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.