Skip to main content

ScrollContainer

ScrollContainer clips a vertically translated content group and draws a focus-aware scrollbar. Use it when a page needs its specific step, long-press, and scrollbar behavior.

It does not stack children itself. Wrap stacked content in VGroup, or give children explicit translations:

ScrollContainer([
VGroup([
Label({ text: 'Overview' }),
Label({ text: longDescription, wrap: true, width: 640 }),
Button({ text: 'Continue' }),
]).itemSpacing(24),
])
.id('detailsScroll')
.width(700)
.viewportHeight(420)
.scrollStep(40)
.scrollDuration(250);

Set viewportHeight for overflow, scrollbar, and scroll-bound calculations. When height is zero, it also becomes the measured height. Width can be explicit or can grow to the furthest child extent.

Input behavior

Up and Down presses move by scrollStep. Long press animates toward the top or bottom at twice the single-step speed; release stops the animation and records the rendered position. Scrollbar visibility depends on content overflow, while its colors reflect whether the container is in the focus chain.

Programmatic scrolling

Look up the mounted ScrollContainerView:

const scroll = this.getSubView<ScrollContainerView>('detailsScroll', true);

scroll?.scrollToTop();
scroll?.scrollTo([0, -200], 400);
scroll?.scrollToBottom();
scroll?.reset();

Scrolling is vertical only. The x value is ignored; y is the content translation, so 0 is the top and a negative value moves farther down the content. reset() jumps immediately, while the other methods animate.

Scrollbar fields

The thumb uses scrollbarUri, scrollbarWidth, scrollbarXOffset, scrollbarYTopOffset, scrollbarYBottomOffset, scrollbarFocusColor, scrollbarUnfocusColor, and optional maxScrollBarHeight.

The track has corresponding scrollbarBackground* URI, width, offset, and focus/unfocus color fields.

Use ScrollView for its broader pointer/wheel alignment options. Use a data/list surface for large, recyclable item sets.

Talk to us