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


84

Як мені визначити, не використовуючи jQuery або будь-яку іншу бібліотеку JavaScript, якщо div з вертикальною смугою прокрутки прокручується до кінця?

Моє питання не в тому, як прокрутити донизу. Я знаю, як це зробити. Я хочу визначити, чи div вже прокручений до дна.

Це не працює:

if (objDiv.scrollTop == objDiv.scrollHeight) 

просто гадаю тут, якщо (objDiv.scrollTop> objDiv.scrollHeight) І може знадобитися зменшити з scrollHeight розмір стрілки прокрутки (скажімо, 20px)
Ітай Моав -Малимовка

Відповіді:


105

Ви досить близько використовуєте scrollTop == scrollHeight.

scrollTop відноситься до верхньої частини позиції прокрутки, яка буде scrollHeight - offsetHeight

Ваше твердження if повинно виглядати так (не забувайте використовувати потрійну рівність):

if( obj.scrollTop === (obj.scrollHeight - obj.offsetHeight))
{
}

Редагувати: Виправив мою відповідь, був абсолютно неправильним


4
Це майже працює, scrollHeight-offsetHeight не є таким самим значенням, як scrollTop, але після спроби вашого коду, якщо мені потрібно, якщо ця різниця менше 5 пікселів, щоб вона була нижньою, я отримую потрібну поведінку.
Бйорн,

1
це не точно. obj.borderWidth потрібно врахувати
цикл

2
я віддаю перевагу цій відповіді: stackoverflow.com/questions/5828275/…
Кріс

3
scrollTopможе бути не інтегральним, тому для цього потрібна певна толерантність (скажімо, obj.scrollHeight - obj.offsetHeight - obj.scrollTop < 1) для роботи за будь-яких обставин. Дивіться stackoverflow.com/questions/5828275/…
Кріс Мартін

можливо, це пов’язано із фіксованими елементами на моєму макеті чи чимось ще дивним, що я роблю, але єдиний раз, коли це оцінюється як істинне, це коли я прокручую весь шлях до початку. Це тому, що document.body.scrollHeightрівне document.body.offsetHeightв моєму випадку (Chrome)
Еван де ла Круз,

25

Для отримання правильних результатів, беручи до уваги такі речі, як можливість межі, горизонтальної смуги прокрутки та / або плаваючої кількості пікселів, вам слід використовувати ...

el.scrollHeight - el.scrollTop - el.clientHeight < 1

ПРИМІТКА. Якщо ви хочете отримати правильні результати, ви ПОВИННІ використовувати clientHeight замість offsetHeight. offsetHeight дасть точні результати лише тоді, коли el не має межі або горизонтальної смуги прокрутки


Також єдина відповідь, яка спрацювала у мене. Я використовую відступ, щоб приховати смугу прокрутки.
Крейг,

clientHeight працював дуже добре. використання offsetHeight у прийнятій відповіді дало мені результат, який не був на 100% точним
Finlay Roelofs

елегантний, спасибі .. Ви також можете використовувати його з Vue у події прокрутки, @scroll="scrolling"а потім у методах scrolling(event) { event.target // as el in the answer }Удачі
Ясін Седрані

10

Запізнилася ця партія, але, здається, жодна з наведених відповідей не працює особливо добре, коли ...

  • Масштабування дисплея застосовується до ОС для дисплеїв UHD
  • Масштабування / масштабування застосовується до браузера

Щоб врахувати всі випадки, вам потрібно округлити розраховане положення прокрутки:

Math.ceil(element.scrollHeight - element.scrollTop) === element.clientHeight

Ця відповідь перша, яка працює належним чином (я також перевірив відповіді зі stackoverflow.com/q/5828275 ). Як зазначали інші, поля, масштаб та інші фактори вступають у гру - і це, здається, справляється з усіма. Редагувати: Відповідь Спенсера нижче, здається, в основному однакова, також правильна.
Ян Брадач,

8

Повертає true, якщо елемент знаходиться в кінці прокрутки, false, якщо ні.

element.scrollHeight - element.scrollTop === element.clientHeight

Мережа розробників Mozilla


1
Для мене, використовуючи Chrome, де елементом є document.body, це не працює. document.body.scrollHeightі document.bodyclientHeightмають однакове значення, тому вираз ніколи не відповідає дійсності.
Еван де ла Круз,

Яке редагування ми можемо зробити, щоб ми могли виявити, що прокрутка знаходиться внизу. Наприклад, якщо прокрутка нижче 75%, розгляньте її внизу
iamsaksham

0
<!DOCTYPE HTML> 
<html> 
<head> 
    <title>JQuery | Detecting when user scrolls to bottom of div. 
    </title> 
</head> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script> 

<body style="text-align:center;" id="body"> 
    <h1 style="color:green;">  
            Data Center  
        </h1> 
    <p id="data_center" style="font-size: 17px; font-weight: bold;"></p> 
    <center> 
        <div class="div" style="width:200px; height:150px; overflow:auto;"> 
            <h1>Hello Friends</h1> 
            <h1>Hello Friends</h1> 
            <h1>Hello Friends</h1> 
            <h1>Hello Friends</h1> 
            <h1>Hello Friends</h1> 
            <h1>Hello Friends</h1> 
            <h1>Hello Friends</h1> 
            <h1>Hello Friends</h1> 
            <h1>Hello Friends</h1> 
            <h1>Hello Friends</h1> 
            <h1>Hello Friends</h1> 
            <h1>Hello Friends</h1> 
            <h1>Hello Friends</h1> 
        </div> 
    </center> 
    <script> 
        $('#data_center').text('Scroll till bottom to get alert!'); 
        jQuery(function($) { 
            $('.div').on('scroll', function() { 
                if ($(this).scrollTop() + $(this).innerHeight() >=  $(this)[0].scrollHeight) {                     
                    alert('End of DIV has reached!'); 
                } 
            }); 
        }); 
    </script> 
</body> 

</html> 

Мені це вдається, сподіваюся, це також допоможе вам. Дякую.


0

Ну, я запитав себе те саме, і я знайшов такий шлях, ось я навів приклад, використовуючи подію:

let scrollableElement = document.querySelector(".elementScrollable")

scrollableElement.addEventListener("scroll",function(event){
  if(event.target.scrollTop === event.target.scrollTopMax){
        console.log("The scroll arrived at bottom")
  }
})


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