components icon indicating copy to clipboard operation
components copied to clipboard

bug(virtual-scroll): scrollToIndex does not work for multiple viewports scrolling over the same element

Open RobinBomkamp opened this issue 2 years ago • 2 comments

Is this a regression?

  • [ ] Yes, this behavior used to work in the previous version

The previous version in which this bug was not present was

No response

Description

If you have multiple viewports beneath eachother the function 'scrollToIndex' does not work if you want to scroll to an element in one of the bottom lists. It scrolls to a wrong position.

Reproduction

StackBlitz link: https://stackblitz.com/edit/components-issue-dch1m4?file=src%2Fapp%2Fexample-component.html,src%2Fapp%2Fexample-component.ts,src%2Fapp%2Fexample-component.css Steps to reproduce:

  1. Click the button 'Scroll to viewport 3 and index 7'
  2. It scrolls to the wrong position.

Expected Behavior

It should scroll to the correct position.

Actual Behavior

It should scroll to the wrong position.

Environment

  • Angular: 16.2.1
  • CDK/Material: 16.2.1
  • Browser(s): Chrome
  • Operating System (e.g. Windows, macOS, Ubuntu): Stackblitz

RobinBomkamp avatar Jan 23 '24 14:01 RobinBomkamp

Still does not work for me. If you have other elements in the same scrolling element you are still scrolling to the wrong location.

RobinBomkamp avatar Feb 08 '24 08:02 RobinBomkamp

It seems to be broken indeed but the fix is simple:

this.viewport.scrollable.scrollTo({
  top: this.viewport.measureViewportOffset('top') + index * itemHeight
})

Harpush avatar May 23 '24 14:05 Harpush

It seems to be broken indeed but the fix is simple:

this.viewport.scrollable.scrollTo({
  top: this.viewport.measureViewportOffset('top') + index * itemHeight
})

Thanks for the suggestion, but it does not work if there is a headline above every list in the viewport.

RobinBomkamp avatar Jul 11 '24 06:07 RobinBomkamp

It seems to be broken indeed but the fix is simple:

this.viewport.scrollable.scrollTo({
  top: this.viewport.measureViewportOffset('top') + index * itemHeight
})

Thanks for the suggestion, but it does not work if there is a headline above every list in the viewport.

Mind sharing a stackblitz? Works fine for me with headers

Harpush avatar Jul 11 '24 06:07 Harpush

It seems to be broken indeed but the fix is simple:

this.viewport.scrollable.scrollTo({
  top: this.viewport.measureViewportOffset('top') + index * itemHeight
})

Thanks for the suggestion, but it does not work if there is a headline above every list in the viewport.

Mind sharing a stackblitz? Works fine for me with headers

Sorry, I had an error in my code. It seems to work. Thank you. :)

RobinBomkamp avatar Jul 11 '24 06:07 RobinBomkamp