В этом руководстве по Firebase написано:
Давайте начнем с рассмотрения нескольких важных концепций с виртуальной прокруткой.Сначала вы объявляете компонент cdk-virtual-scroll-viewport, чтобы обеспечить контекст для виртуальной прокрутки.У него должно быть свойство ввода itemSize , определенное как высота пикселя каждого элемента .
Вы можете видеть, что это не сделано специально для видов прокрутки сетки, но мы можем обойти это ограничение:
У вас есть 5 столбцов изображений, каждый высотой 160 пикселей плюс поля сверхуи снизу каждые 10 пикселей, получая 180 пикселей.
Теперь мы вычисляем 180, деленное на 5 и получаем 36. Это itemSize
, что вам нужно.
<cdk-virtual-scroll-viewport itemSize="36">
<div class="image" *cdkVirtualFor="let image of images">
<a (click)="viewDetail(image)">
<img src="https://picsum.photos/200/160/?image={{ image.id }}" />
</a>
</div>
</cdk-virtual-scroll-viewport>
См. этовилка вашего StackBlitz
Официальная документация здесь: Angular |Прокрутка
Вы также можете изменить размер буфера
<cdk-virtual-scroll-viewport itemSize="36" minBufferPx="540" maxBufferPx="540">
<!-- ... -->
</cdk-virtual-scroll-viewport>
См .: Angular |Прокрутка # Прокрутка по элементам фиксированного размера
Вы также можете позволить Angular выполнять математику:
<cdk-virtual-scroll-viewport itemSize="{{ 180 / 5 }}" minBufferPx="{{ 180 * 3 }}" maxBufferPx="{{ 180 * 3 * 3 }}">
Это означает, что вы заранее загрузите три страницы (3 строки на страницу)и загрузить больше, если только один буфер страницы (3 строки изображений на страницу) оставлен