Infinite scrolling has been around for a while. The basic idea: as you scroll, new content loads at the bottom, creating a seemingly endless scroll. Implementing this is simple, but without careful planning, performance suffers. After a few content refetches, you could have hundreds of DOM elements, many invisible. Luckily, patterns exist to mitigate this, and we'll explore one using Angular.
This is what we want to avoid.
Virtual Scrolling
Virtual scrolling renders only a subset of a large list at any time—distinct from infinite scrolling. It's ideal for large datasets where rendering everything at once is inefficient. Only visible (and near-visible) items are rendered; as the user scrolls, items are dynamically swapped. This significantly reduces DOM elements, boosting performance.
Virtual scrolling works by creating a container matching the viewport height. Only the visible items (plus a buffer) are rendered within this container at a specific scroll depth, managed via CSS. Scrolling updates the container, showing new items and removing those out of view, adjusting scroll depth. Combining this with infinite scrolling creates a virtually infinite list without performance penalties.
The example below shows a list of thousands of items, but renders a maximum of 8 at once. Scrolling adjusts the CSS scroll height, creating the illusion of a much longer list.
Real-World Example
Let's build an Angular application fetching media from Reddit's paginated API and displaying it in a virtual scrolling list. It will include a search bar for subreddit selection and a filter. Scrolling down loads more content. Our key requirements:
- Driven by RxJS Observables and the async pipe.
- Resets content on subreddit or filter changes, but not on appending new content.
- Stores previous content in memory for seamless up/down scrolling without redundant API calls.
We'll use the @angular/cdk
package (containing the Virtual Scroller component). Install it with npm i @angular/cdk
.
While this example uses Angular, similar patterns are applicable to React, Vue, or vanilla JavaScript. A basic demo illustrating the underlying principles is available here.
Service Setup
First, we create a service to fetch content from the Reddit API using Angular's HttpClient
and RxJS Observables to manage the subreddit name and filter. (Some code is omitted for brevity; the complete implementation is here).
// ... (Omitted for brevity) ...
The content fetching method tracks specific properties during data requests. A page
property is added to the query string to ensure new content is fetched after the last item. We also filter out NSFW content and items lacking a post hint. This ensures only expected content is displayed.
// ... (Omitted for brevity) ...
The query$
observable (previously omitted) merges different observable streams before fetching content. The scan
operator combines previous and current stream results, building a large data array across multiple pages.
This allows for extensive scrolling; only subreddit name or filter changes trigger a complete refetch. nextPage
, a property of query$
, stores the last item ID in the current set, used to determine which page to fetch next when nearing the bottom of the Virtual Scroller.
// ... (Omitted for brevity) ...
The power of RxJS lies in combining and manipulating data streams. This allows us to handle business logic before it reaches the component, keeping the component cleaner and re-usable.
Component Setup
Next, we set up the component to display content using Angular's CdkVirtualScrollViewport
. A method handles scrolling near the viewport bottom, fetching the next page via the subRedditPage$
observable.
// ... (Omitted for brevity) ...
The template uses the async pipe to subscribe to query$
. Note: Virtual Scrollers become more complex with variable-height content; consistent item heights are recommended for performance.
// ... (Omitted for brevity) ...
The onScroll
method fetches more content when the user nears the bottom. It uses the nextPage
ID (from query$
) and emits to subRedditPage$
, triggering the next API call and updating the list via query$
.
// ... (Omitted for brevity) ...
The search bar and tab controls are also integrated (simplified example below).
// ... (Omitted for brevity) ...
Conclusion
This creates a virtually infinite scroller. You can test it here. Reddit's API has rate limits; you might hit them during testing. For more details, including additional features, see the GitHub repository here.
The above is the detailed content of Virtually Infinite Scrolling with Angular. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

CSS blocks page rendering because browsers view inline and external CSS as key resources by default, especially with imported stylesheets, header large amounts of inline CSS, and unoptimized media query styles. 1. Extract critical CSS and embed it into HTML; 2. Delay loading non-critical CSS through JavaScript; 3. Use media attributes to optimize loading such as print styles; 4. Compress and merge CSS to reduce requests. It is recommended to use tools to extract key CSS, combine rel="preload" asynchronous loading, and use media delayed loading reasonably to avoid excessive splitting and complex script control.

ThebestapproachforCSSdependsontheproject'sspecificneeds.Forlargerprojects,externalCSSisbetterduetomaintainabilityandreusability;forsmallerprojectsorsingle-pageapplications,internalCSSmightbemoresuitable.It'scrucialtobalanceprojectsize,performanceneed

No,CSSdoesnothavetobeinlowercase.However,usinglowercaseisrecommendedfor:1)Consistencyandreadability,2)Avoidingerrorsinrelatedtechnologies,3)Potentialperformancebenefits,and4)Improvedcollaborationwithinteams.

CSSismostlycase-insensitive,butURLsandfontfamilynamesarecase-sensitive.1)Propertiesandvalueslikecolor:red;arenotcase-sensitive.2)URLsmustmatchtheserver'scase,e.g.,/images/Logo.png.3)Fontfamilynameslike'OpenSans'mustbeexact.

Autoprefixer is a tool that automatically adds vendor prefixes to CSS attributes based on the target browser scope. 1. It solves the problem of manually maintaining prefixes with errors; 2. Work through the PostCSS plug-in form, parse CSS, analyze attributes that need to be prefixed, and generate code according to configuration; 3. The usage steps include installing plug-ins, setting browserslist, and enabling them in the build process; 4. Notes include not manually adding prefixes, keeping configuration updates, prefixes not all attributes, and it is recommended to use them with the preprocessor.

CSScounterscanautomaticallynumbersectionsandlists.1)Usecounter-resettoinitialize,counter-incrementtoincrease,andcounter()orcounters()todisplayvalues.2)CombinewithJavaScriptfordynamiccontenttoensureaccurateupdates.

In CSS, selector and attribute names are case-sensitive, while values, named colors, URLs, and custom attributes are case-sensitive. 1. The selector and attribute names are case-insensitive, such as background-color and background-Color are the same. 2. The hexadecimal color in the value is case-sensitive, but the named color is case-sensitive, such as red and Red is invalid. 3. URLs are case sensitive and may cause file loading problems. 4. Custom properties (variables) are case sensitive, and you need to pay attention to the consistency of case when using them.

CSSselectorsandpropertynamesarecase-insensitive,whilevaluescanbecase-sensitivedependingoncontext.1)Selectorslike'div'and'DIV'areequivalent.2)Propertiessuchas'background-color'and'BACKGROUND-COLOR'aretreatedthesame.3)Valueslikecolornamesarecase-insens
