jQuery检测屏幕滚动并添加静态HTML

jQuery检测屏幕滚动并添加静态HTML,jquery,scroll,detection,Jquery,Scroll,Detection,我有一些代码,当你滚动,然后调用一个函数检测 在这个功能中,我希望能够在滚动时淡入内容。因此,当我到达页面底部时,它会调用一个函数,然后静态html片段就会消失,比如说一次10行内容 希望有人能帮我完成这件事,因为我卡住了:- 谢谢好的,所以首先您可能需要某种比例来确定要淡入的行数。你为什么需要这个比例?如果用户只向下滚动一英寸,您不希望在6英寸的内容中褪色 我想在这里做一个说明,并指出在您的最终实现中,比例不是您想要使用的。虽然这是一种简单的解决方案,但实际上,相对于页面的位置和内容大小,您

我有一些代码,当你滚动,然后调用一个函数检测

在这个功能中,我希望能够在滚动时淡入内容。因此,当我到达页面底部时,它会调用一个函数,然后静态html片段就会消失,比如说一次10行内容

希望有人能帮我完成这件事,因为我卡住了:-


谢谢

好的,所以首先您可能需要某种比例来确定要淡入的行数。你为什么需要这个比例?如果用户只向下滚动一英寸,您不希望在6英寸的内容中褪色

我想在这里做一个说明,并指出在您的最终实现中,比例不是您想要使用的。虽然这是一种简单的解决方案,但实际上,相对于页面的位置和内容大小,您可能希望淡入一定数量的内容。此外,您希望内容淡入,即使访问者看不到整行内容(如果需要,我可以稍后帮助您)

就我们的目的而言,假设每行的高度为20px,行与行之间没有空间,我们的比率是每滚动20px就有1行淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡

下一步是设计一种跟踪滚动次数的方法。为了简单起见,我们只需使用一个变量来保持当前窗口位置(该变量将在每滚动20px后更新一次):

接下来,您将希望创建一种跟踪淡入的行数的方法。有很多方法可以做到这一点(有些方法比我将要使用的方法更好),但为了简单起见,我将使用一个变量

var rowsShown = 0;
接下来,您需要编写滚动事件处理程序来调用代码,以确定是否应该,如果应该,则在行中淡入淡出:

$(window).scroll(function () {
    ...code to determine if you should and actually fade in rows...
});
现在,您需要编写条件语句,以确定是否应在任何行中淡入。首先写入另一个变量以确定新窗口位置,并将其与存储在
current
中的上一个位置进行比较。请记住,我们的比例是每行20px,因此窗口必须滚动至少20px才能在另一行中消失:

var newPosition = $(window).scrollTop();

if ((newPosition - current) >= 20) {
    ...fade in rows...
    current += 20; //update current
} 
我想指出,出于我们在本简单“教程”中的目的,您将希望将当前设置为比以前多20,而不是将其更新为新的当前位置(
newPosition
)。为什么,你问?因为鼠标不总是一次滚动一个像素(事实上,它们几乎从来没有这样做过),所以我们保持简单,每行20像素的淡入,我们希望通过将当前值保持在20的倍数来保持这个比例。当需要编写最终版本时,您可能希望将其更改为
current=newPosition但是

接下来,您必须编写淡入代码:

$(rowsToFadeIn).eq(rowsShown).fadeIn(speed, function () {
    rowsShown += 1; //increment the accumulator
    ...do any other call back stuff here...
});
最后,您需要编写一个类似的方法来向上滚动并淡出您的内容(否则,如果您再次向上滚动并开始向下滚动,您将不会看到您的内容淡出-它将在您前面淡出)

请注意,这不是完整的实现-这只是让您开始。找些东西给你测试和玩。一旦你让它工作,我会修改脚本的效果部分,使用
.promise().done()
,以确定上一个效果何时完成。如果您对使用
.promise().done()
感到不舒服,那么我将执行以下操作:

  • 创建一个变量
    var facing=0
    ,以保存当前正在衰减的元素数
  • 每次要开始淡入某个元素时,您都将执行以下操作:

  • 在淡入淡出时添加一个
  • 通过类似于以下内容的调用调用您的效果:

    $(rowsToFade).eq(rowsShown).delay((衰落-1)*速度).fadeIn(…)

    • 延迟<代码>(淡入-1)*速度
  • 等待所有当前正在运行的淡入(不包括您将要运行的淡入)
  • .fadeIn()
    方法的回调中,从淡入(
    淡入-=1;
    )中减去一,以防止不必要的延迟

  • 如果我是你的话,我会尽量避免使用计时器。计时器的开销相当大,而且它们从来不会完全按照你的要求进行操作。此外,使用它们(如淡入淡出)往往会产生不稳定的效果,特别是在速度较慢的浏览器中,偶尔在Chrome等速度较快的浏览器中

    如果您对此有任何疑问,请告诉我。我很乐意提供帮助。祝您好运!:)

    编辑:我差点忘了,您必须将主体或包装器元素的高度设置为如果元素是正常流的一部分时的高度,因为
    显示:无
    (这是
    fadeIn
    fadeOut
    所必需的)将从流中删除它们,并将页面缩短到没有它们时的高度。这可能会导致您甚至没有滚动条

    编辑2:还请注意,您可以(如果使用它,也应该)使用
    .delay()
    改进建议的更新实现,因为您无疑会遇到不必要的延迟。如果你不喜欢A计划(
    .promise().done()
    );),基本上就是B计划


    但是,如果您是jQuery新手,那么您可能会从改进B而不是使用A中学到更多。

    Hi Paul。这里有一个链接,指向我为工作中的一个项目编写的脚本之一,它可能会对您有所帮助。目标是在访问者单击查看更多/查看更少时,使用侧导航窗格和jQuery淡入/淡出列表中预定数量的链接。您将不得不修改它,以满足您的目的,并在滚动上开火,但它可能会帮助您指向正确的方向。它与IE 6-10兼容。如果你有任何问题,请告诉我
    var newPosition = $(window).scrollTop();
    
    if ((newPosition - current) >= 20) {
        ...fade in rows...
        current += 20; //update current
    } 
    
    $(rowsToFadeIn).eq(rowsShown).fadeIn(speed, function () {
        rowsShown += 1; //increment the accumulator
        ...do any other call back stuff here...
    });