为什么(jQuery)Waypoints“bottom-in-view”对隐藏元素不起作用?

我试图使用jQuery和Waypoints(formely jQuery Waypoints)在用户向下滚动时动态显示隐藏的图像。

我发现我可以非常轻松地向一个元素添加一个航点,并在元素“在视图中”时触发处理程序(在底部视图中设置偏移属性)。

但是,尝试使用相同的属性对隐藏元素不起作用:在加载页面后立即触发处理程序。

例如:当它们进入视口时隐藏已经显示的元素很容易。 ( 例1:jsFiddle ):

var waypoints = $('.dynamic').waypoint({ handler: function (direction) { $(this).hide(700); }, offset: 'bottom-in-view' }); 

但是,我想做的是相反的:当我们滚动到它的位置时显示一个隐藏的元素。 下一个示例不起作用,因为处理程序在window.load()事件之后立即触发,而不是等待用户向下滚动。 ( 例2:jsFiddle ):

 var waypoints = $('.dynamic').waypoint({ // these elements are display: none handler: function (direction) { $(this).show(700); }, offset: 'bottom-in-view' }); 

我找到了解决办法。 我使用一个空的(但不是隐藏的)div来附加航点。 然后,当我向下滚动到上述div时,航点被执行。 在div的处理程序中,我使用jQuery来显示其他元素。 ( 例3:jsFiddle ):

 var waypoints = $('#emptyDiv').waypoint({ handler: function (direction) { $('.dynamic').show(700); }, offset: 'bottom-in-view' }); 

但是,我仍然感到困惑的是为什么在附加到隐藏元素后,在window.load()之后立即触发了航点。 尽管没有显示,航路点所附着的元素在页面的下方。

这不仅仅是'bottom-in-view' 。 当元素被隐藏且显示为none时,每个偏移都会失败。 有关显示无元素的Waypoints调试指南部分详细介绍了这一点。

Waypoints的工作原理是询问元素在页面上的位置,以便它可以计算触发处理程序所需的滚动位置。 但是显示没有元素不在页面上。 当被问到时,这些元素在0,0报告自己。