【问题标题】:Trigger .scroll function inside another .scroll function (endless looping page)在另一个 .scroll 函数中触发 .scroll 函数(无限循环页面)
【发布时间】:2021-07-21 12:20:25
【问题描述】:

我设法创建了一个类似于以下内容的无缝循环页面: Continuous Looping Page (Not Infinite Scroll)

但不是从页尾循环到页顶,而是在两个 div ID 内循环,此处引用的问题:Endless looping page

循环解决了这个问题: https://codepen.io/akmalmo/pen/YzNggJR

 var loopend = $('#loop-end').offset().top;
 var loopstart = $('#loop-start').offset().top;

$(document).scroll(function() {
    if ( $(document).scrollTop() >= loopend ) {
    $(document).scrollTop($('#loop-start').offset().top)
    }
  else if ( $(document).scrollTop() <= loopstart ) {
    $(document).scrollTop($('#loop-end').offset().top)
    }
});

现在解决问题!我想要实现的是在滚动到#loop-start 后调用此函数,而不是让它直接进入循环(我希望在页面加载时保留的图像上方有一些空白)。我在这里试过这个:https://codepen.io/akmalmo/pen/QWdPmER - 但这会使循环停止向一个方向工作。您仍然可以向后循环,但它会卡在向前的方向上。我错过了什么?也不能调整窗口大小,但我想这是另一个问题。

var element_position = $('#loop-init').offset().top;

$(document).on('scroll', function() {
    var y_scroll_pos = window.pageYOffset;
    var scroll_pos_test = element_position;

    if(y_scroll_pos > scroll_pos_test) {


 var loopend = $('#loop-end').offset().top;
 var loopstart = $('#loop-start').offset().top;

$(document).scroll(function() {
    if ( $(document).scrollTop() >= loopend ) {
    $(document).scrollTop($('#loop-start').offset().top)
    }
  else if ( $(document).scrollTop() <= loopstart ) {
    $(document).scrollTop($('#loop-end').offset().top)
    }
    
});
         }
});

我几乎可以通过将一些 px 值添加到不同的状态来让它工作。如果他们有相同的位置可能是问题。它有点工作,但它有故障且不可预测:https://codepen.io/akmalmo/pen/eYgoQKd

有没有更简单的方法来完成上述操作?另外,是否有更好的方法来计算响应且不会在窗口调整大小时中断的偏移量?

【问题讨论】:

  • 为什么window.scroll里面有document.scroll?
  • 好收获。我已将其更改为文档。但问题仍然存在。
  • 我猜滚动调用到相同的地方有冲突?
  • 你可以删除一个文档滚动,因为你已经在其中了。
  • 我想帮忙,但我不确定您要完成什么。您是否有一个很好的工作示例(其他地方)来说明您要实现的目标?

标签: jquery offset scrolltop portfolio endlessscroll


【解决方案1】:
let prev_pos = $(document).scrollTop();
let loopstart_reached = false;
const loopend = $('#loop-end').offset().top;
const loopstart = $('#loop-start').offset().top;

$(document).on('scroll', function() {
  // if we scrolled past the loopstart element then we can iterate through
  if(loopstart_reached){
    // the current Y position is less or equal to the previous position, this means we are scrolling upwards
    if(prev_pos <= $(document).scrollTop()){
      if ( $(document).scrollTop() >= loopend ) {
        $(document).scrollTop($('#loop-start').offset().top)
      }
    }
    // else we are scrolling downwards
    else{
      if ( $(document).scrollTop() <= loopstart ) {
        $(document).scrollTop($('#loop-end').offset().top)
      }
    }
  }
  
  // store the new Y scroll pos
  prev_pos = $(document).scrollTop();
  
  // check if we reached the loopstart position
  if(prev_pos >= loopstart){
    loopstart_reached = true;
  }
});

这将是我的解决方案,只需观察我们是向下滚动还是向上滚动,然后到达所需元素,然后滚动到另一个元素。

【讨论】:

  • 你好丹尼尔。这感觉更扎实,谢谢。虽然如果一个人还没有达到循环开始并试图向上滚动,你会直接进入循环结束。有没有办法阻止它朝那个方向工作,直到你达到循环开始?
  • “上去”的那个也应该有prev_pos的东西吗?还。刷新前一个位置有什么作用?抱歉,只是想了解一下
  • refresh previous position 表示我们正在存储新的 scrollTop 值,以便在下一次滚动迭代中进行比较,如果之前的 Y 值小于当前的 Y 值,那么我们将向上(向上滚动)跨度>
  • 这正是我一直在寻找的,与之配套的 cmets 非常有帮助,谢谢@Daniel!
猜你喜欢
  • 2015-05-15
  • 2017-11-18
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多