【发布时间】:2019-05-30 12:40:52
【问题描述】:
我正在尝试实现一个 HTML 无限滚动器,其中在任何给定时间列表中只有少数 div 元素(以保持较小的内存占用)。
我将一个新的 div 元素添加到列表中,同时我删除了第一个,因此 div 的总数保持不变。
不幸的是,视口并没有保持静止,而是向后跳跃了一点(实际上是删除的 div 的高度)。 有没有办法在从列表中删除 div 时保持视口静止?
我制作了一个小型的自包含 HTML 页面(好吧,它仍然需要 JQuery 3.4.1),它暴露了问题:它首先添加 5 个 div,然后不断添加一个新的 div,并每隔 1 秒删除第一个
function getRandomColor() {
var letters = '0123456789ABCDEF';
var color = '#';
for (var i = 0; i < 6; i++) {
color += letters[Math.floor(Math.random() * 16)];
}
return color;
}
function removeit() {
// remove first one
var tiles = $(".tile");
$(tiles[0]).remove();
}
function addit() {
// append new one
var jqueryTextElem = $('<div class="tile" style="height:100px;background-color:' + getRandomColor() + '"></div>');
$("#inner-wrap").append(jqueryTextElem);
}
function loop() {
removeit();
addit();
window.setTimeout(loop, 1000);
}
addit();
addit();
addit();
addit();
addit();
loop();
<div id="inner-wrap"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
【问题讨论】:
-
如果您删除顶部
div,猜猜新顶部div是什么?下一个,强制浏览器重新绘制,从而产生跳跃效果。 IMO,您正在让浏览器做更多的工作,您应该保持外部 div 不变,如果您更关心额外的 DOM 元素,则可以删除内部内容。 -
@Rikin 我真正想要实现的是一个无限滚动器,在该滚动器中,我在底部添加了一个 div,然后删除了顶部的 div,从而保持 div 计数较低。暂时我只会处理向下滚动。下一步将向上,这意味着在顶部添加一个新 div 并在底部删除一个。
-
是的,因此您必须为旧 div 保留不动产,除非您不打算在网页上设置滚动条,在这种情况下,视口中的顶部 div 始终位于首位。
-
@Rikin 有趣,您能否详细说明或修复示例?
标签: javascript jquery html css scroll