9

Scenario:

  • Tried a basic virtual scroll test reading this blog post
  • the array had lots of items
  • there was no error
  • the list loaded in a virtual scroll but the height of it was 0 by default

quick fix was to

  • set the height for cdk-virtual-scroll-viewport to 500px or set the height for class 'example-viewport' in app.component.css

Question: what is the proper way to overcome this zero height?

sample at https://stackblitz.com/edit/angular-efdcyc

3
  • With a height: 100%; it will get the parents height, you can handle the parents size as any other div in your page. Commented Oct 23, 2018 at 9:42
  • @ibenjelloun, wouldn't work... you can try here angular-efdcyc.stackblitz.io ... but am i missing some dependency which should take care of it? Commented Oct 23, 2018 at 9:45
  • 4
    Imho the way to style the cdk-virtual-scroll-viewport element is totally arbitrary and a hit or miss. The itemSize property makes no sense at all, so you have to play with styles and the property until you get it about right. The documentation and the design of the component is a joke. Commented May 17, 2019 at 8:44

4 Answers 4

12
  • use min-height of 100% for the viewport and verify
  • make sure, the height set on the viewport with 'itemSize' matches the height of the item in css
  • if you are using an Observable, make sure to resolve it with *ngIf and the async pipe. Important: the html element is an ng-container, because it may not be rendered for the min-width to work!

      .list {
         min-height: 100%;
      }
    
      .item {
         height: 100px;
      }
    

When using an Observable as a source

<ng-container *ngIf="obs$ | async; let data">
  <cdk-virtual-scroll-viewport itemSize="100" class="list">
1
  • Thanks for the reply, item height of 100px is arbitary... (2nd bullet) height of the item can change during responsiveness to screen size so we can't get the exact match; Commented Dec 6, 2018 at 9:25
6

Add necessary CSS styles to provide the height of the element

.example-viewport {
  height: 200px;
  width: 200px;
  border: 1px solid black;
}

.example-item {
  height: 50px;
}

You can see the full content of the example you have mentioned here. https://material.angular.io/cdk/scrolling/overview

They also used custom CSS to style their elements.

Updated Slackblitz

2
  • height of 50px or 500px is not exact... it should be tied to the itemSize which we define in <cdk-virtual-scroll-viewport>... but you're right that the example also gave a fixed number for the height !! Commented Oct 23, 2018 at 10:35
  • 1
    I saw that elements exist but screen was completely white. Until I saw your solution. Thanks a lot!
    – EranKT
    Commented Sep 21, 2022 at 13:50
5

This CSS works for me (no fixed height required):

<cdk-virtual-scroll-viewport class="viewport">  
   .......
</cdk-virtual-scroll-viewport>

.viewport { 
   display: contents;
}
1
0

From these answers, I like the one with display: contents; most because it has no % or px.

This also worked for me:

cdk-virtual-scroll-viewport { 
    contain: none;
}

Not the answer you're looking for? Browse other questions tagged or ask your own question.