Virtual scrolling helps show only the visible items in a long list. This makes the app faster and smoother.
Virtual scrolling for large lists in Angular
Start learning this pattern below
Jump into concepts and practice - no test required
import { Component } from '@angular/core'; import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling'; @Component({ selector: 'app-virtual-scroll', template: ` <cdk-virtual-scroll-viewport itemSize="50" class="viewport"> <div *cdkVirtualFor="let item of items" class="item"> {{item}} </div> </cdk-virtual-scroll-viewport> `, styles: [ `.viewport { height: 200px; width: 300px; border: 1px solid #ccc; } .item { height: 50px; display: flex; align-items: center; padding-left: 10px; border-bottom: 1px solid #eee; }` ] }) export class VirtualScrollComponent { items = Array.from({ length: 1000 }).map((_, i) => `Item #${i + 1}`); }
The cdk-virtual-scroll-viewport sets the visible area and item size.
The *cdkVirtualFor directive works like *ngFor but only renders visible items.
<cdk-virtual-scroll-viewport itemSize="40" class="viewport"> <div *cdkVirtualFor="let item of items" class="item"> {{item}} </div> </cdk-virtual-scroll-viewport>
<cdk-virtual-scroll-viewport itemSize="60" class="viewport"> <div *cdkVirtualFor="let item of items" class="item"> {{item}} </div> </cdk-virtual-scroll-viewport>
<cdk-virtual-scroll-viewport itemSize="50" class="viewport"> <div *cdkVirtualFor="let item of []" class="item"> No items to show </div> </cdk-virtual-scroll-viewport>
<cdk-virtual-scroll-viewport itemSize="50" class="viewport"> <div *cdkVirtualFor="let item of ['Only one item']" class="item"> {{item}} </div> </cdk-virtual-scroll-viewport>
This Angular app shows a list of 1000 items using virtual scrolling. Only visible items render, making scrolling smooth and fast. The viewport has a fixed height and width with keyboard focus styles for accessibility.
import { Component } from '@angular/core'; import { ScrollingModule } from '@angular/cdk/scrolling'; import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; @Component({ selector: 'app-root', template: ` <h2>Virtual Scroll Example</h2> <cdk-virtual-scroll-viewport itemSize="50" class="viewport" aria-label="List of items"> <div *cdkVirtualFor="let item of items" class="item" tabindex="0"> {{item}} </div> </cdk-virtual-scroll-viewport> `, styles: [ `.viewport { height: 200px; width: 300px; border: 1px solid #ccc; overflow: auto; } .item { height: 50px; display: flex; align-items: center; padding-left: 10px; border-bottom: 1px solid #eee; } .item:focus { outline: 2px solid #1976d2; background-color: #e3f2fd; }` ] }) export class AppComponent { items = Array.from({ length: 1000 }).map((_, i) => `Item #${i + 1}`); } @NgModule({ declarations: [AppComponent], imports: [BrowserModule, ScrollingModule], bootstrap: [AppComponent] }) export class AppModule {}
Virtual scrolling improves performance by rendering only visible items, reducing DOM size.
Time complexity for rendering is O(visible items), not total items.
Common mistake: forgetting to set itemSize causes wrong scroll behavior.
Use virtual scrolling when lists are very long; for short lists, normal *ngFor is simpler.
Virtual scrolling shows only visible list items to improve speed.
Use cdk-virtual-scroll-viewport and *cdkVirtualFor in Angular.
Set fixed itemSize and style viewport for best results.
Practice
cdk-virtual-scroll-viewport in Angular for large lists?Solution
Step 1: Understand virtual scrolling purpose
Virtual scrolling aims to improve performance by rendering only the visible items in a large list.Step 2: Identify
This Angular component implements virtual scrolling by showing only the items visible in the viewport, reducing DOM load.cdk-virtual-scroll-viewportroleFinal Answer:
It renders only visible items to improve performance. -> Option AQuick Check:
Virtual scrolling = render visible items only [OK]
- Thinking it sorts or animates items
- Assuming it duplicates items for speed
- Confusing with pagination
Solution
Step 1: Identify correct directive for virtual scroll
Angular CDK virtual scroll requires*cdkVirtualForinstead of*ngForto render visible items only.Step 2: Check syntax and itemSize usage
TheitemSizeattribute is required oncdk-virtual-scroll-viewportto set fixed item height for scrolling calculations.Final Answer:
<cdk-virtual-scroll-viewport itemSize="50"><div *cdkVirtualFor="let item of items">{{item}}</div></cdk-virtual-scroll-viewport> -> Option CQuick Check:
Use *cdkVirtualFor with itemSize on viewport [OK]
- Using *ngFor instead of *cdkVirtualFor
- Using 'let item in items' instead of 'of'
- Omitting itemSize attribute
<cdk-virtual-scroll-viewport itemSize="40" style="height: 120px;">
<div *cdkVirtualFor="let item of items">{{item}}</div>
</cdk-virtual-scroll-viewport>and
items = ['A', 'B', 'C', 'D', 'E'], how many items will be visible at once?Solution
Step 1: Calculate viewport height in pixels
The viewport height is set to 120px.Step 2: Divide viewport height by itemSize
Each item is 40px tall, so 120px / 40px = 3 items visible at once.Final Answer:
3 items -> Option AQuick Check:
Visible items = viewport height / itemSize = 3 [OK]
- Counting all items instead of visible ones
- Ignoring style height on viewport
- Using wrong division operator
<cdk-virtual-scroll-viewport itemSize="50">
<div *cdkVirtualFor="let item in items">{{item}}</div>
</cdk-virtual-scroll-viewport>Solution
Step 1: Check syntax of *cdkVirtualFor directive
The correct syntax uses 'of' to iterate over items, not 'in'. Using 'in' causes a template error.Step 2: Verify other attributes
itemSize can be a string representing a number, and style height is recommended but not syntax error. The directive must be on the repeated element, not viewport.Final Answer:
Using *cdkVirtualFor with 'in' instead of 'of' causes an error. -> Option DQuick Check:
*cdkVirtualFor uses 'of', not 'in' [OK]
- Using 'in' instead of 'of' in *cdkVirtualFor
- Forgetting to set viewport height
- Placing directive on wrong element
Solution
Step 1: Understand virtual scroll requirements
Virtual scrolling requires a fixeditemSizeto calculate visible items and smooth scrolling.Step 2: Use correct directives and styles
Usecdk-virtual-scroll-viewportwith a fixed height and*cdkVirtualForto render only visible items efficiently.Step 3: Avoid common pitfalls
Not settingitemSizeor using*ngForcauses performance issues or errors.Final Answer:
Use cdk-virtual-scroll-viewport with fixed itemSize, set viewport height, and use *cdkVirtualFor. -> Option BQuick Check:
Fixed itemSize + *cdkVirtualFor + viewport height = smooth scroll [OK]
- Omitting itemSize or viewport height
- Using *ngFor instead of *cdkVirtualFor
- Trying variable item sizes without special handling
