JS。如何跟踪同一容器内三个独立部分的进度

JS. How to track progress of three separate sections within the same container

请参阅 Codepen 以更好地理解我要解释的内容。您可以在滚动时跟随控制台查看代码中变量的值。

在第 2 部分中,我有三个面板(面板 1、面板 2 和面板 3),我想在滚动时通过三个单独的进度条跟踪它们。因此,当我滚动浏览第 2 部分时,面板 1 处于视图中 - 面板 1 的进度条应该填充,面板 2 和面板 3 的进度条应如此。

要查看面板 1,第 2 部分从 0% 开始到 22% 结束,(我认为)是: sectionProgress / 22 - sectionProgress 是我在第 2 部分滚动的程度。但是,面板 2 从第 2 部分的 22% 开始到 75%,结束而面板 3 从 75% 开始到 100% 结束 <- 并且 这就是我不知道要使用什么公式的地方

更简单地说:

面板 1 处于视图中时:

面板 2 处于视图中时:

面板 3 处于视图中时:

对于面板 2,您必须计算滚动位置 22% 到 75% 之间的百分比。你是从 0% 到 75% 计算的。 (必须对面板 3 应用相同的逻辑。)

if(sectionProgress < 22) {
  percentagePanelTwo = 0
} 
else if(sectionProgress <= 75) {
  percentagePanelTwo =  (sectionProgress - 22) / (75-22)
} else {
  percentagePanelTwo = 1;
}

另一个代码改进是删除每个面板计算周围的 ifs

 // remove => if (scrolledFromTop >= sidePanelOffsetPanelOne) {

因为如果用户再次向上滚动,这将阻止进度条缩小。

请注意,在上面的第一个代码示例中,我处理了所有三种情况:

  • percentagePanelTwo 为 0,如果滚动在面板之前
  • percentagePanelTwo 的变量值,如果滚动在第二面板中
  • 并且 percentagePanelTwo = 1 如果滚动在面板二之后

如果您对没有那二十个 GSAP 相关依赖项的更“纯粹”的解决方案持开放态度,这里是您当前构建的重现,利用 CSS 滚动捕捉与 JS 事件侦听器配对淡出在每个部分的不同背景颜色之间,并相应地填充清空进度条。

这里还有一个注意事项,为了流畅的用户体验,由于第一个面板在滚动阈值之上开始,用户通常必须滚动过去才能开始填充相关的进度条,我有条件地设置了 smooth class 在进度条容器上启用 CSS 过渡,当进度条接近任一边缘时,在左侧或右侧。

当不靠近边缘时,不需要过渡,所以class被移除。在不需要时进行过渡实际上会导致另一个不良副作用,其中一个柱可能会在另一个柱完全结束之前开始填充 fills/empties。

这是我的解决方案,具有 0 个依赖项: https://codepen.io/brandonmcconnell/pen/f58fd03211eaf02467b1e92c116042b6?editors=0010