Làm cách nào để xác định xem một div có được cuộn xuống dưới cùng hay không?


84

Làm cách nào để xác định, mà không cần sử dụng jQuery hoặc bất kỳ thư viện JavaScript nào khác, nếu một div có thanh cuộn dọc được cuộn xuống dưới cùng?

Câu hỏi của tôi không phải là làm thế nào để cuộn xuống dưới cùng. Tôi biết làm thế nào để làm điều đó. Tôi muốn xác định xem div đã được cuộn xuống dưới cùng chưa.

Điều này không hoạt động:

if (objDiv.scrollTop == objDiv.scrollHeight) 

chỉ cần đoán ở đây nếu (objDiv.scrollTop> objDiv.scrollHeight) Và có thể cần phải giảm kích thước từ scrollHeight của mũi tên cuộn (giả sử 20px)
Itay Moav -Malimovka

Câu trả lời:


105

Bạn đang sử dụng khá gần scrollTop == scrollHeight.

scrollTop đề cập đến vị trí đầu cuộn, sẽ là scrollHeight - offsetHeight

Câu lệnh if của bạn sẽ trông giống như vậy (đừng quên sử dụng ba dấu bằng):

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

Chỉnh sửa: Đã sửa câu trả lời của tôi, hoàn toàn sai


4
Điều đó gần như hoạt động, scrollHeight-offsetHeight không có cùng giá trị như scrollTop, nhưng sau khi thử mã của bạn, nếu tôi yêu cầu nếu sự khác biệt đó nhỏ hơn 5 pixel để nó ở dưới cùng, tôi sẽ có được hành vi mà tôi muốn.
Bjorn

1
điều này không chính xác. obj.borderWidth cần được xem xét
lặp lại

2
tôi thích câu trả lời này hơn: stackoverflow.com/questions/5828275/…
Chris

3
scrollTopcó thể là không tích phân, vì vậy điều này đòi hỏi một số dung sai (giả sử obj.scrollHeight - obj.offsetHeight - obj.scrollTop < 1) để hoạt động trong mọi trường hợp. Xem stackoverflow.com/questions/5828275/…
Chris Martin

có thể nó liên quan đến các yếu tố cố định trên bố cục của tôi hoặc điều gì đó kỳ lạ khác mà tôi đang làm nhưng lần duy nhất điều này được đánh giá là đúng là khi tôi cuộn hết cỡ lên trên cùng. Điều này là do document.body.scrollHeightbằng document.body.offsetHeighttrong trường hợp của tôi (Chrome)
Evan de la Cruz.

24

Để có được kết quả chính xác khi tính đến những thứ như khả năng có đường viền, thanh cuộn ngang và / hoặc số lượng pixel nổi, bạn nên sử dụng ...

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

LƯU Ý: Bạn PHẢI sử dụng clientHeight thay vì offsetHeight nếu bạn muốn nhận được kết quả chính xác. offsetHeight sẽ chỉ cung cấp cho bạn kết quả chính xác khi el không có đường viền hoặc thanh cuộn ngang


Cũng là câu trả lời duy nhất phù hợp với tôi. Tôi đang sử dụng đệm để ẩn thanh cuộn.
Craig

clientHeight hoạt động rất tốt. sử dụng offsetHeight trong câu trả lời được chấp nhận cho tôi một kết quả đó không phải là chính xác 100%
Finlay Roelofs

thanh lịch, cảm ơn bạn .. bạn cũng có thể sử dụng nó với Vue trong một sự kiện cuộn @scroll="scrolling"sau đó trong các phương pháp scrolling(event) { event.target // as el in the answer }Chúc may mắn
Yassine Sedrani

10

Đến bữa tiệc này hơi muộn, nhưng không có câu trả lời nào ở trên dường như hoạt động đặc biệt hiệu quả khi ...

  • Tỷ lệ màn hình được áp dụng cho hệ điều hành cho màn hình UHD
  • Tỷ lệ / thu phóng được áp dụng cho trình duyệt

Để phù hợp với tất cả các trường hợp, bạn sẽ cần làm tròn vị trí cuộn được tính toán:

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

Câu trả lời này là câu trả lời đầu tiên hoạt động bình thường (tôi cũng đã kiểm tra câu trả lời từ stackoverflow.com/q/5828275 ). Như những người khác đã đề cập, lợi nhuận, thu phóng và các yếu tố khác có tác dụng - và điều này dường như giải quyết tất cả. Chỉnh sửa: Câu trả lời của Spencer dưới đây về cơ bản giống nhau, cũng chính xác.
Jan Bradáč

8

Trả về true nếu một phần tử nằm ở cuối cuộn của nó, false nếu không.

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

Mạng nhà phát triển Mozilla


1
Đối với tôi, sử dụng Chrome, trong đó phần tử là document.body, điều này không hoạt động. document.body.scrollHeightdocument.bodyclientHeightcó cùng giá trị và do đó, biểu thức không bao giờ đúng.
Evan de la Cruz

Chúng tôi có thể chỉnh sửa gì để có thể phát hiện, cuộn đó ở gần cuối. Ví dụ, nếu cuộn dưới 75%, xem xét nó gần đáy
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> 

Nó hoạt động cho tôi, tôi hy vọng, điều này cũng sẽ giúp bạn. Cảm ơn.


0

Chà, tôi cũng tự hỏi mình như vậy, và tôi đã tìm ra cách này, ở đây tôi đặt một ví dụ bằng cách sử dụng một sự kiện:

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

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

0

Cái này phù hợp với tôi. Một chút cách tiếp cận khác.

if (list.scrollTop + list.clientHeight >= list.scrollHeight - 1) {
    return 'scrollOnTheBottom';
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.