使用jQuery检测用户何时滚动到div的底部


218

我有一个div框(称为“通量”),里面包含可变数量的内容。此divbox的溢出设置为auto。

现在,我想做的是,当使用滚动到此DIV框的底部时,将更多内容加载到页面中,我知道如何执行此操作(加载内容),但我不知道如何检测用户何时滚动到div标签的底部?如果我想在整个页面上都这样做,我会选择.scrollTop并将其从.height中减去。

但我似乎无法在这里这样做?

我试过从磁通量中获取.scrollTop,然后将所有内容包装在称为inner的div中,但是如果我将磁通量的innerHeight返回564px(div的高度设置为500)和“ innner”的高度当div底部显示564时,它返回1064和滚动顶部。

我能做什么?

Answers:


420

您可以使用一些属性/方法:

$().scrollTop()//how much has been scrolled
$().innerHeight()// inner height of the element
DOMElement.scrollHeight//height of the content of the element

因此,您可以取前两个属性的总和,当它等于最后一个属性时,您已经到达末尾:

jQuery(function($) {
    $('#flux').on('scroll', function() {
        if($(this).scrollTop() + $(this).innerHeight() >= $(this)[0].scrollHeight) {
            alert('end reached');
        }
    })
});

http://jsfiddle.net/doktormolle/w7X9N/

编辑:我已经按照以下方式将“绑定”更新为“打开”:

从jQuery 1.7开始,.on()方法是将事件处理程序附加到文档的首选方法。


2
当DOM准备就绪以确保#flux-element可用时,它将进行绑定。
Dr.Molle

1
您应该使用ON而不是bind更新您的答案,不赞成使用on绑定
-ncubica

34
注意:当用户在其浏览器上使用缩放级别时,这可能无法正常工作。缩放导致innerHeight()报告小数。在一个用户的情况下缩小,总和scrollTop()innerHeight()将总是至少的一小部分短scrollHeight。我最终添加了20px的缓冲区。产生的条件是if(el.scrollTop() + el.innerHeight() >= el[0].scrollHeight - 20)哪里el等于$(this)
尼克,

1
这是有史以来对我非常有效的最佳答案。谢谢
Ashish Yadav

1
它不再工作了,能否请您确认为什么它不工作,谢谢
Umair Shah Yousafzai

50

我找到了一个解决方案,当您滚动窗口并从底部显示div的结尾时,您会收到警报。

$(window).bind('scroll', function() {
    if($(window).scrollTop() >= $('.posts').offset().top + $('.posts').outerHeight() - window.innerHeight) {
        alert('end reached');
    }
});

在此示例中,如果您在div(.posts)完成则会发出警报。


谢谢你,但是当div到达该div的底部时,我该如何使其动画呢?当您向上滚动时,也要检测该div的顶部,然后进行动画处理。就像此网站lazada.com.ph/apple上的侧边栏行为一样希望您能对我有所帮助:)
艾丽莎·雷耶斯

它就像魔术一样工作,但是问题是警报执行了两次,因此,如果您内部调用一个函数,警报将被执行两次
Afaf

1
@ 1616我var running = false在此之前声明了一个变量。在条件内,我检查if(!running) { running = true; // and continue logic } 这种方式仅被调用一次!当AJAX完成时,设置running = false;
Jacob Raccuia

1
关于窗口,但是问题关于div。
亚历山大·沃尔科夫,

42

尽管这个问题是在5.5年前提出的,但在当今的UI / UX上下文中仍然比实际问题重要。我还要加两分钱。

var element = document.getElementById('flux');
if (element.scrollHeight - element.scrollTop === element.clientHeight)
    {
        // element is at the end of its scroll, load more content
    }

来源:https : //developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#Determine_if_an_element_has_been_totally_scrolled

某些元素不允许您滚动元素的整个高度。在这种情况下,您可以使用:

var element = docuement.getElementById('flux');
if (element.offsetHeight + element.scrollTop === element.scrollHeight) {
  // element is at the end of its scroll, load more content
}

2
如果您不使用jQuery,这就是您要寻找的解决方案。
Petter Pettersson

有事件处理程序吗?
亚历山大·沃尔科夫

@AlexanderVolkov滚动是相关事件。
思考

9

当我在寻找要滚动的固定div的解决方案时发现了这一点,这里只是一个补充说明。对于我的情况,我发现最好考虑div上的填充,这样我才能准确地结束。因此,扩展@ Dr.Molle的答案,我添加了以下内容

$('#flux').bind('scroll', function() {
    var scrollPosition = $(this).scrollTop() + $(this).outerHeight();
    var divTotalHeight = $(this)[0].scrollHeight 
                          + parseInt($(this).css('padding-top'), 10) 
                          + parseInt($(this).css('padding-bottom'), 10)
                          + parseInt($(this).css('border-top-width'), 10)
                          + parseInt($(this).css('border-bottom-width'), 10);

    if( scrollPosition == divTotalHeight )
    {
      alert('end reached');
    }
  });

这将为您提供精确的位置,包括填充和边框


7

虽然这对我有用

$(window).scroll(function() {
  if ($(window).scrollTop() >= (($(document).height() - $(window).height()) - $('#divID').innerHeight())) {
    console.log('div reached');
  }
});

3

如果您需要在具有溢出-y的div(隐藏或滚动)的div上使用它,则可能需要这样的东西。

if ($('#element').prop('scrollHeight') - $('#element').scrollTop() <= Math.ceil($('#element').height())) {
    at_bottom = true;
}

我发现需要ceil是因为prop scrollHeight似乎是圆的,或者可能是由于其他原因导致此值小​​于1。


3

如果您不使用Math.round()函数,则在浏览器窗口具有缩放功能的情况下,Dr.Molle 建议的解决方案将无法使用。

例如$(this).scrollTop()+ $(this).innerHeight()= 600

$(this)[0] .scrollHeight收益= 599.99998

600> = 599.99998失败。

这是正确的代码:

jQuery(function($) {
    $('#flux').on('scroll', function() {
        if(Math.round($(this).scrollTop() + $(this).innerHeight(), 10) >= Math.round($(this)[0].scrollHeight, 10)) {
            alert('end reached');
        }
    })
});

如果您不需要严格的条件,也可以添加一些额外的空白像素

var margin = 4

jQuery(function($) {
    $('#flux').on('scroll', function() {
        if(Math.round($(this).scrollTop() + $(this).innerHeight(), 10) >= Math.round($(this)[0].scrollHeight, 10) - margin) {
            alert('end reached');
        }
    })
});

2

在简单的DOM使用中,您可以检查条件

element.scrollTop + element.clientHeight == element.scrollHeight

如果为true,那么您已经结束了。


1

如果有人得到scrollHeightas undefined,则选择元素的第一个子元素:mob_top_menu[0].scrollHeight


1

不知道是否有帮助,但这是我的方法。

我有一个比窗口大的索引面板,并且让它滚动直到到达该索引为止。然后我将其固定在适当的位置。滚动到页面顶部后,该过程将反向进行。

问候。

<style type="text/css">
    .fixed_Bot {    
            position: fixed;     
            bottom: 24px;    
        }     
</style>

<script type="text/javascript">
    $(document).ready(function () {
        var sidebarheight = $('#index').height();
        var windowheight = $(window).height();


        $(window).scroll(function () {
            var scrollTop = $(window).scrollTop();

            if (scrollTop >= sidebarheight - windowheight){
                $('#index').addClass('fixed_Bot');
            }
            else {
                $('#index').removeClass('fixed_Bot');
            }                   
        });
    });

</script>

1

尽管这个问题被问了将近6年,但在UX设计上仍然是热门话题,但是如果有新手想使用,这里是演示片段

$(function() {

  /* this is only for demonstration purpose */
  var t = $('.posts').html(),
    c = 1,
    scroll_enabled = true;

  function load_ajax() {

    /* call ajax here... on success enable scroll  */
    $('.posts').append('<h4>' + (++c) + ' </h4>' + t);

    /*again enable loading on scroll... */
    scroll_enabled = true;

  }


  $(window).bind('scroll', function() {
    if (scroll_enabled) {

      /* if 90% scrolled */
    if($(window).scrollTop() >= ($('.posts').offset().top + $('.posts').outerHeight()-window.innerHeight)*0.9) {

        /* load ajax content */
        scroll_enabled = false;  
        load_ajax();
      }

    }

  });

});
h4 {
  color: red;
  font-size: 36px;
  background-color: yellow;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div class="posts">
  Lorem ipsum dolor sit amet  Consectetuer augue nibh lacus at <br> Pretium Donec felis dolor penatibus <br> Phasellus consequat Vivamus dui lacinia <br> Ornare nonummy laoreet lacus Donec <br> Ut ut libero Curabitur id <br> Dui pretium hendrerit
  sapien Pellentesque <br> Lorem ipsum dolor sit amet <br> Consectetuer augue nibh lacus at <br> Pretium Donec felis dolor penatibus <br> Phasellus consequat Vivamus dui lacinia <br> Ornare nonummy laoreet lacus Donec <br> Ut ut libero Curabitur id <br>  Dui pretium hendrerit sapien Pellentesque <br> Lorem ipsum dolor sit amet <br> Consectetuer augue nibh lacus at <br> Pretium Donec felis dolor penatibus <br> Phasellus consequat Vivamus dui lacinia <br> Ornare nonummy laoreet lacus Donec <br> Ut ut
  libero Curabitur id <br> Dui pretium hendrerit sapien Pellentesque <br> Lorem ipsum dolor sit amet <br> Consectetuer augue nibh lacus at <br> Pretium Donec felis dolor penatibus <br> Phasellus consequat Vivamus dui lacinia <br> Ornare nonummy laoreet
  lacus Donec <br> Ut ut libero Curabitur id <br> Dui pretium hendrerit sapien Pellentesque
</div>


0

伙计们,这是缩放问题的解决方案,适用于所有缩放级别,以备不时之需:

if ( Math.abs(elem.offset().top) + elem.height() + elem.offset().top >= elem.outerHeight() ) {
                    console.log("bottom");
                    // We're at the bottom!
                }
            });
        }

0
$(window).on("scroll", function() {
    //get height of the (browser) window aka viewport
    var scrollHeight = $(document).height();
    // get height of the document 
    var scrollPosition = $(window).height() + $(window).scrollTop();
    if ((scrollHeight - scrollPosition) / scrollHeight === 0) {
        // code to run when scroll to bottom of the page
    }
});

是github上的代码。


-1

这是另一个版本。

关键代码是功能scroller(),它使用overflow:scroll将输入作为包含滚动部分的div的高度。距顶部或底部大约5像素,距底部大约10像素。否则它太敏感了。看来10px约为最小值。您会看到它将div高度加10以得到底部高度。我认为5px可能有效,但我并未进行广泛测试。YMMV。scrollHeight返回内部滚动区域的高度,而不是div的显示高度,在这种情况下为400px。

<?php

$scrolling_area_height=400;
echo '
<script type="text/javascript">
          function scroller(ourheight) {
            var ourtop=document.getElementById(\'scrolling_area\').scrollTop;
            if (ourtop > (ourheight-\''.($scrolling_area_height+10).'\')) {
                alert(\'at the bottom; ourtop:\'+ourtop+\' ourheight:\'+ourheight);
            }
            if (ourtop <= (5)) {
                alert(\'Reached the top\');
            }
          }
</script>

<style type="text/css">
.scroller { 
            display:block;
            float:left;
            top:10px;
            left:10px;
            height:'.$scrolling_area_height.';
            border:1px solid red;
            width:200px;
            overflow:scroll; 
        }
</style>

$content="your content here";

<div id="scrolling_area" class="scroller">
onscroll="var ourheight=document.getElementById(\'scrolling_area\').scrollHeight;
        scroller(ourheight);"
        >'.$content.'
</div>';

?>

1
-1,因为从php生成javascript + css代码是不好的做法(难以维护,没有可重用性,没有网站优化等)。此外,正如@Alexander Millar指出的那样,可以通过考虑填充来固定10px偏移量。考虑使用此代码的任何人都应该三思而后行……
Kapitein Witbaard '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.