好的,首先您可能需要某种比例来确定要淡入多少行。为什么需要这个比例?如果用户只向下滚动一英寸,您不想淡入 6 英寸的内容。
我想在这里做一个说明,并指出在您的最终实现中,比例不是您想要使用的。尽管这是一种考虑解决方案的简单方法,但实际上您将希望淡入与您的页面位置和内容大小相关的大量内容。此外,您将希望内容淡入,即使访问者看不到整行(如果需要,我稍后可以帮助您)。
出于我们的目的,假设每行的高度为 20px,行之间没有空格,我们的比率是每滚动 20px 1 行淡入(请注意,按照这个比例,您的内容不会淡入,直到您将其完全滚动到视图中)。
下一步是设计一种方法来跟踪您滚动了多少。为简单起见,我们只使用一个变量来保存当前窗口位置(此变量将在每滚动 20px 后更新):
var current = $(window).scrollTop(); //sets the initial value
接下来,您将想要创建一种方法来跟踪您已经淡入的行数。有很多方法可以做到这一点(有些比我要使用的更好),但为了起见,我将使用一个变量简单的。
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
}
我想指出,为了我们在这个简单的“教程”中的目的,您需要将 current 设置为比以前多 20,而不是将其更新到新的当前位置 ( newPosition
)。你为什么问?因为鼠标并不总是一次滚动一个像素(事实上,它们几乎不这样做),所以我们保持简单,每行 20px 淡入,我们希望通过保持当前为 20 的倍数来保持该比例。当需要编写最终版本时,您可能希望将其更改为current = newPosition;
然而。
接下来,您将不得不编写淡入代码:
$(rowsToFadeIn).eq(rowsShown).fadeIn(speed, function () {
rowsShown += 1; //increment the accumulator
...do any other call back stuff here...
});
最后,您将需要编写一个类似的方法来向上滚动和淡出您的内容(否则,如果您向上滚动并再次开始向下滚动,您将不会看到您的内容淡出它 - 它会在您面前淡出)。
请注意,这不是完整的实现——这只是为了让你开始。并得到一些东西供您测试和玩耍。一旦你让它工作,我会修改脚本的效果部分以使用.promise().done()
以确定前一个效果何时完成。如果您对使用 a 感到不舒服,.promise().done()
那么我会执行以下操作:
- 创建一个变量
var fading = 0
来保存您当前正在淡出的元素数量。
每次您要开始淡化一个元素时,您将执行以下操作:
- 添加一个到
fading
通过类似这样的调用调用你的效果:
$(rowsToFade).eq(rowsShown).delay((fading - 1) * speed).fadeIn(.....
(fading - 1) * speed
等待所有当前正在运行的淡入淡出延迟(不包括您将要运行的淡入淡出)
- 在您的
.fadeIn()
方法的回调中,从淡入淡出 ( ) 中减一,fading -= 1;
以防止不必要的延迟。
如果我是你,我会尽量避免使用计时器。他们有相当多的开销,而且他们永远不会完全按照您的意愿行事。另外,使用淡入淡出之类的东西往往会产生断断续续的效果,尤其是在速度较慢的浏览器中,偶尔在 Chrome 等较快的浏览器中。
如果您对此有任何疑问,请告诉我。我很乐意提供帮助。祝你好运!:)
编辑:我几乎忘记了,如果您的元素是正常流程的一部分,您将不得不将主体或包装元素的高度设置为高度,因为display: none
(对于fadeIn
and是必需的fadeOut
)将从中删除它们流动并将您的页面缩短到没有它们的高度。这可能会导致您甚至没有滚动条。
编辑 2:还请注意,您可以(并且应该如果使用它)改进建议的更新实现,.delay()
因为您无疑会遇到不必要的延迟。如果您不喜欢 A 计划(.promise().done()
),则基本上是 B 计划;)
但是,如果您是 jQuery 新手,那么您可能会从改进 B 中学到比使用 A 更多的东西。