【问题标题】:Content flicker/jump on infinite scroll/loop无限滚动/循环上的内容闪烁/跳转
【发布时间】:2013-01-30 11:29:48
【问题描述】:

我正在寻找帮助/指向正确方向的点/或在循环/无限网站上滚动时出现闪烁/跳转的解决方案,可以在 this fiddle 中看到。

似乎是什么导致了跳跃:

$(window).scrollTop(half_way - child_height);”,也可能是 Chrome 窗口的 scrollTop 错误,但目前所有浏览器都在发生。

如果我删除“- child_height”,则不再有闪烁但页面不再正确滚动,这可以在this fiddle 中看到。

此外,在第一次滚动时,右侧的列向上跳了三个框 - 也是因为“half_way”,我可以通过给它一个“bottom: -600px;”来解决这个问题

完整代码:

http://jsfiddle.net/djsbaker/j3d8r/1/

var num_children = $('#up-left').children().length;
var child_height = $('#up-left').height() / num_children;
var half_way = num_children * child_height / 2;
$(window).scrollTop(half_way);

function crisscross() {
    $('#up-left').css('bottom', '-' + window.scrollY + 'px');
    $('#down-right').css('bottom', '-' + window.scrollY + 'px');
    var firstLeft = $('#up-left').children().first();
    var lastLeft = $('#up-left').children().last();
    var lastRight = $('#down-right').children().last();
    var firstRight = $('#down-right').children().first();

    if (window.scrollY > half_way ) {

        $(window).scrollTop(half_way - child_height);
        lastRight.appendTo('#up-left');
        firstLeft.prependTo('#down-right');

    } else if (window.scrollY < half_way - child_height) {

        $(window).scrollTop(half_way);
        lastLeft.appendTo('#down-right');
        firstRight.prependTo('#up-left');
    }
}

$(window).scroll(crisscross);

【问题讨论】:

  • 为避免闪烁,您需要 i) 克隆您正在修改的父元素。 ii) 修改克隆版本 iii) 用修改后的克隆版本替换原始版本。抱歉,实际上无法让它在小提琴中工作。 (作为第一步,您需要从使用 ID 更改为使用类。)
  • 啊,好的,非常感谢。我尝试使用克隆,这是我第一次使用它,但在删除它们时遇到了问题。我会再试一次。

标签: javascript jquery html infinite-scroll


【解决方案1】:

好的 - 这是一个'working' version - 我的意思是它比以前更不闪烁。我以为它没有闪烁,那是在我使用电池供电的时候,但插入电源并且 CPU 速度足够快,可以闪烁。

正如我所提到的,要消除闪烁,您需要克隆对象、操作它们然后将它们替换到 DOM 中,而不是直接操作 DOM。

我通过获取&lt;div id="content"&gt; 的内容来操作它们,然后将它们替换到那个

中。

另外,最好只在 DOM 中查找一次,然后使用对该对象的引用而不是重复搜索。例如

var leftSide = $(clone).find('.up-left');
....
lastRight.appendTo(leftSide);
....
 $(leftSide).css('bottom', '-' + window.scrollY + 'px');

而不是:

lastRight.appendTo('#up-left');
$('#up-left').css('bottom', '-' + window.scrollY + 'px');

搜索 DOM 相对较慢,因此存储引用可以提高性能/减少闪烁。

存储对象还使代码更易于理解(恕我直言),因为您可以轻松地看到您引用的是同一事物,而不是可能不同的事物。

【讨论】:

  • 啊,看来我的克隆完全错了,非常感谢您的解释-这是一个很大的帮助。我现在在左侧栏上闪烁,右侧现在可以使用您的解决方案(我在 Windows 上使用 Chrome)。它在 Firefox Windows 上很漂亮。
  • 很奇怪,虽然 windows 上的 Chrome 会出现问题,而 mac 上的 chrome 很好
  • 将接受您的回答,因为它完美地回答了问题。看起来 Window Chrome 可能仍然存在 scrollTop 错误,我将尝试寻找解决方案。
  • 我发现通过使用减号顶部似乎可以解决 chrome windows 上的问题:jsfiddle.net/wkWVy/6
【解决方案2】:

我仍然在使用 Danack 解决方案的 Windows 上的 chrome 中闪烁。对于这个站点,我将控制所有滚动(您已经手动滚动一侧),并为元素提供绝对位置。

或者如果你坚持使用浏览器滚动,可能会使用动画:动画最后一个元素的高度直到 0px 然后使用 appendTo,然后从 0px 动画到正常高度...

【讨论】:

  • 是的,我的也一样(在 Windows 上使用 Chrome)。我尝试了一个为 0 的空隐藏 div,然后每次都会扩展,但似乎无法使其正常工作。我正在使用一个小型武器库,因为这对我来说都是全新的。给每个盒子绝对位置?
  • 在 css 中,位置:绝对;然后api.jquery.com/offset 并从浏览器中接管滚动控制stackoverflow.com/questions/5802467/… api.jquery.com/event.preventDefault
  • 我也学到了一些新东西,不知道你可以使用 el.prependTo() 在 DOM 周围扔东西
  • 是的 - 现在我的计算机上实际上仍然有点闪烁,现在我使用主电源。它仅在使用电池时无闪烁,因此 CPU 运行速度较慢。
  • 在我的 Firefox 上像梦一样工作,奇怪的 Chrome 是一种痛苦。抵消和防止默认,又是两个新的东西让我玩......我认为周日下午有学习曲线:)
【解决方案3】:

这可能是一个很长的镜头,但我在使用无限滚动时也有同样的闪烁, 并最终使用了imagesLoaded。我最终添加了带有淡入的附加图像(现在已加载),并且由于它们已加载,因此它们不会闪烁。

因此,也许通过使用加载的图像 - 或对图像进行回调,您可以解决闪烁问题。虽然它确实降低了速度。我可以想象,如果您想尽快滚动浏览所有内容,这可能不是解决方案。祝你好运!

【讨论】:

  • 谢谢,会试一试。我认为我的理想是用户不会像被赞助一样滚动浏览网站,但我想我无法阻止他们这样做。
【解决方案4】:

一种解决方案是不使用本机滚动功能,而是模拟滚动。这可以通过将您的内容的overflow 设置为“隐藏”以及捕获其上的“鼠标滚轮”事件并在调用它时触发一些操作来完成。我开始尝试here(使用 MooTools 而不是 jQuery,因为我更熟悉它)。它目前只是通过更改第一个元素的 margin-top 在左侧“工作”。

我接下来的步骤是:

  • 检查第一个元素的负边距顶部是否大于它的高度,如果是,则将其移动到右侧。
  • 右侧最后一个框的逻辑相同,底部边距为负。

不过,这有一些缺点。模拟滚动感觉不像原生滚动功能那么自然,并且单击鼠标滚轮不起作用。这些可能是可以解决的,但需要更多的编码才能使其顺利工作。无论如何,最终您将获得一个没有任何闪烁且侧面没有粘性滚动条的解决方案(替换的想法可能是侧面的一个小区域触发鼠标悬停时的滚动)。

【讨论】:

  • 感谢您的提示。无粘性滚动条是一个非常好的解决方案,目前它会在中途跳转并且如果用户使用它滚动则无法使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多