**实现步骤:**
1. **容器**: 需要一个固定高度的外部容器 (`overflow-y: auto`)。
2. **撑开**: 内部需要一个极高的 div,高度 = 总数量 * 预估高度,为了让滚动条看起来正确。
3. **计算**:
- `startIndex = Math.floor(scrollTop / itemHeight)`
- `endIndex = startIndex + visibleCount`
- 为了防止快速滚动白屏,通常会加一个 `buffer` (比如上下多渲染 5 个)。
4. **偏移**: 实际渲染的列表 `<ul>` 需要 `transform: translateY(startIndex * itemHeight)` 移回到可视窗口。
**不定高度解决方案:**
- 这是一个难点。通常方案是 `ResizeObserver`。
- 渲染后监听 item 的实际高度,更新到 `positions` 数组中。
- 这种情况下,滚动条会有"跳动"现象,需要做滚动位置修正。