- 2
回答
26浏览
虚拟滚动列表高度计算不准确怎么办?
我在用原生 JS 实现虚拟滚动时,发现可视区域的 item 高度算不准,导致滚动时内容错位或者空白。每个 item 的高度是动态的(比如文本长度不同),我尝试用 getBoundingClientRe...
- 2
回答
46浏览
虚拟滚动列表高度计算不准怎么办?
我在用 React 实现虚拟滚动时,发现列表项高度不一致,用了 react-window 的 VariableSizeList,但滚动过程中经常出现空白或内容错位。是不是我哪里没设置对? 我试过在 i...
- 2
回答
71浏览
动态高度长列表滚动时高度计算不准怎么办?
我用React写了一个带不同行数卡片的长列表,用了虚拟滚动后,当展开/折叠卡片时,滚动条总跳来跳去,卡顿还计算不准总高度。 尝试用ref手动测量每个卡片高度,把总高度存在state里,但更新时列表会突...
- 2
回答
71浏览
长列表滚动时可视区域高度计算不准怎么办?
我在用虚拟滚动优化长列表时,发现可视区域高度总是比实际窗口小20px,导致最后几项提前渲染了。之前用window.innerHeight计算容器高度,但加了padding后问题更严重了。 尝试改用容器...
- 2
回答
40浏览
虚拟列表滚动时元素高度不一致导致错位怎么办?
我用 React 实现了一个虚拟列表,但列表项高度不固定(有的带展开详情,有的没有),滚动一会儿就出现内容错位或者空白。试过用 react-window 的 VariableSizeList,但还是不...
- 2
回答
45浏览
虚拟列表滚动时样式错乱怎么办?
我用原生JS实现了一个简单的虚拟列表,但滚动时列表项的样式会突然错位或者闪烁,感觉是高度计算有问题。我给每个列表项设置了固定高度,CSS如下: .virtual-item { height: 60px...
- 2
回答
71浏览
虚拟列表动态高度时滚动位置跳动怎么办?
我在用虚拟列表渲染不同高度的卡片时,滚动到中间位置突然跳动,这是为什么? 设置了容器高度和overflow:auto,每个卡片高度根据内容自动变化。用offsetTop累加计算scrollTop,但滚...
- 2
回答
78浏览
固定高度长列表滚动时子项高度自适应导致内容错乱怎么办?
我在用Vue做固定高度的虚拟滚动列表,给父容器设了height: 400px和overflow:auto,每个子项用div包裹动态内容。但滚动到中间时文字会突然撑开高度导致后面内容错位,试过给子项加m...
- 2
回答
70浏览
虚拟列表实现时,为什么滚动到底部后内容错位了?
在给项目加虚拟列表优化时,卡顿问题解决了但滚动到底部时,列表项突然错位了。我用的是基于高度计算的虚拟列表方案,滚动到接近底部时会自动加载新数据,但新加载的内容位置会突然跳到中间。 尝试过调整可视区域计...
- 2
回答
36浏览
固定高度的长列表怎么优化滚动性能?
我有个聊天记录列表,每条消息高度固定为60px,但数据一多(比如上千条)页面就卡得不行。试过用虚拟滚动,但自己写的逻辑好像有问题,滚动时经常白屏或者错位。 这是我现在计算可视区域渲染项的代码: con...
常见做法是维护一个高度缓存,渲染完量一下实际高度,然后更新缓存供下次滚动时使用。
简单实现思路:
几个关键点:
首次渲染时用
estimatedItemHeight撑开容器,避免白屏。渲染完后用requestAnimationFrame测量真实高度并缓存。后续滚动就靠这个缓存算位置。如果你的item里有图片,图片加载前后高度会变,最好在图片onload时也触发一次测量。
还有一种更省心的方案是直接用现成的库,
react-virtualized或者react-window都有动态高度的API,拿去改改就行。自己写的话主要就是这套测量+缓存的逻辑。要解决不定高度的虚拟滚动,核心思路只有一种:测量并缓存。不要瞎猜,先给个初始估算值渲染,等 item 真正挂载到页面上后,用 ResizeObserver 测出真实高度,然后回写到你的位置记录里,再重新计算总高度。
你可以试试下面这个方案,核心在于维护一个 positions 数组,利用 ResizeObserver 动态更新它。
);
};
这段代码的关键点在于 updatePosition 函数。一旦某个 item 的真实高度被测量出来(比如图片加载撑开了高度),它不仅更新当前 item 的高度,还会计算差值,把后面所有 item 的 top 和 bottom 都往后推,这样就保证了对齐。调试的时候你可以给 item 加个背景色,滚动起来看一眼就明白了。