前段时间,有个面试官问我一个问题,假如有一个筛选项数据量很大,加载很慢,卡顿。如何优化。当时没有答出来。我猜想他是想问我虚拟滚动技术。后来我查了下虚拟滚动,这个和IOS中的UITableView的机制十分类似。
网页虚拟滚动并非技术源头来自 iOS UITableView ,但二者核心设计思想同源;前端虚拟滚动是独立演进的方案,只是大量前端库实现时直接借鉴了 UITableView 的 Cell 复用设计模式。
一、时间线:UITableView 远早于前端虚拟滚动
1.iOS UITableView(2007 年,iOS 2.0)
iPhone 初代发布时就内置UITableView,自带Cell 对象复用池机制:
- 只创建一屏可视数量的 Cell;
- 滑出屏幕的 Cell 回收进复用池,滚动复用时仅修改数据,不新建视图;
- 底层基于原生 UIView 对象池,是移动端首个大规模普及的可视区复用滚动方案。
2.前端虚拟滚动成型(2015--2016 年)
- 早期网页长列表优化仅为分片渲染(时间切片分批插入 DOM),无复用逻辑,仍会累积大量 DOM 节点;
- 成熟虚拟列表库
react-virtualized(2015)、vue-virtual-scroller(2016)才实现 DOM 复用逻辑; - 网页环境受浏览器 DOM 模型、滚动事件、布局计算限制,实现路径和 iOS 原生完全隔离。
二、底层机制:思路相似,但实现底层完全不同
相同核心思想(对象池 / 可视区懒渲染)
- 只维护可视窗口 + 少量缓冲区的渲染单元;
- 超出视口的单元回收 / 复用,避免一次性创建成千上万个渲染对象;
- 通过 "虚拟占位高度" 模拟完整滚动条总尺寸,保证滚动交互正常。
关键底层差异(证明不是同源衍生)

三、技术溯源:思想借鉴,而非 "源自"
1.更早的通用计算机思想
"仅渲染可视区域、对象池复用" 是图形界面通用优化思路,在 Mac OS 9、桌面 GUI、游戏精灵渲染(80 年代)就已存在,并非 iOS 独创。UITableView 只是把这套思路做成移动端标准化 API。
2.前端开发者的参考
2015 年后前端开发者大量跨端接触 iOS 开发,发现 UITableView 复用方案完美解决网页长列表痛点,于是把Cell 复用池模型移植到 DOM 层:
vue-virtual-scroller、rc-virtual-list文档均明确标注 "逻辑参考 iOS TableView Cell 复用";- 但网页虚拟滚动要适配浏览器 DOM、滚动事件、CSS 布局约束,是从零重写的独立实现,并非移植 iOS 代码 / 底层机制。
3.不存在技术继承关系
- Web 标准、浏览器渲染引擎、iOS UIKit 是两套完全独立的技术体系;
- 虚拟滚动的雏形(分片渲染)出现时,前端社区并未参考 iOS 机制,只是后来成熟阶段借鉴了复用设计。
四、补充:容易混淆的两个概念
1.惯性滚动(momentum scrolling)
这个交互特性确实源自 iOS ,Safari 通过-webkit-overflow-scrolling: touch复刻;但这和 "虚拟滚动 / 可视区复用" 是完全无关的两个技术点。
2.RecyclerView(Android)
Android 5.0 推出的RecyclerView复用机制,和 UITableView、前端虚拟列表三者是平行演进、互相参考的关系,不存在单向源头。
总结
- 网页虚拟滚动不是源自 UITableView,二者是独立发展、底层实现完全隔离的两套技术;
- 它们共享一套通用图形优化思想(可视区懒渲染 + 对象池复用),前端成熟虚拟滚动库在设计上大量借鉴了 UITableView 的 API 与复用逻辑;
- 若简化描述可以说 "网页虚拟滚动借鉴了 iOS TableView 的 Cell 复用思路",但严谨来说不能表述为 "源自 TableView 机制"。