虚拟列表的可视范围如何计算?变高内容和滚动跳动怎么处理?
先理解原理和示例,再练习完整口述与追问。
回答要点
固定高度按 scrollTop/itemHeight 定位;上下占位和 overscan;可变高度用测量与前缀和;稳定 key、滚动锚点、数据范围与无障碍。
原理拆解
虚拟列表只渲染视口附近的一小段记录,通过总高度占位维持滚动条。固定行高 h 时,可从 floor(scrollTop/h) 得到起始索引,根据视口高度计算可见数量,再在两侧增加 overscan 缓冲。实际渲染项可以在外层总高度容器中按 start*h 偏移,或者用上下占位块补齐,接近结尾时要把索引裁剪到合法范围。
可变行高不能直接除以 h,需要维护估算值与实测高度,通过前缀和定位偏移,数据量大时用二分搜索,更新频繁时可使用适合前缀查询的数据结构。图片、展开区域或字体加载改变高度后,应更新缓存,并以当前可见的某条稳定记录为滚动锚点校正偏移,避免上方高度改变导致内容突然跳动。
列表 key 应使用稳定业务 ID,不能因窗口复用就错误复用表单状态;焦点项被移出窗口时要定义处理策略。搜索、分页和后端加载与虚拟化是不同问题,虚拟化不会自动减少接口传输量。表格列对齐、定位到指定项、回到历史位置、屏幕阅读器和浏览器页内查找也需要专门设计,不能把只渲染十行的演示当作完整生产列表。
示例与推演
行高 40px、scrollTop=405、视口 400px 时,起始约为 10,视口可能跨到第 20 项,按区间公式并加 overscan,再裁剪到数据范围;不能只取 ceil(400/40)=10 项而忽略顶部不足一行导致底部缺项。可变行高先用估值再测量,并保持可见记录锚点。
易错点
总高度、偏移与渲染区间要一致。图片加载改变上方高度时,未校正 scrollTop 会造成跳动;焦点与浏览器页内查找也需定义策略。
参考回答可直接练习口述
虚拟列表只渲染视口附近的一小段记录,通过总高度占位维持滚动条。固定行高 h 时,可从 floor(scrollTop/h) 得到起始索引,根据视口高度计算可见数量,再在两侧增加 overscan 缓冲。实际渲染项可以在外层总高度容器中按 start*h 偏移,或者用上下占位块补齐,接近结尾时要把索引裁剪到合法范围。