<scroll-view>

Basic scrolling component supporting both horizontal and vertical scrolling. When its content area is larger than its visible area, it allows users to scroll to reveal more content.

Usage

Horizontal and Vertical Scrolling

<scroll-view> supports both horizontal and vertical scrolling, implemented through the scroll-orientation properties. <scroll-view> always uses the linear layout, and the layout direction is determined by the scroll-orientation attributes.

Scroll Events

Use event callbacks such as bindscroll, bindscrolltoupper, and bindscrolltolower to monitor changes in scroll progress.

Sticky Capability

As a child node of <scroll-view>, you can set the sticky attribute making the child node remain at a certain distance from the top of the <scroll-view> and not continue scrolling with the content.

TIP

sticky can only be set for direct child nodes of <scroll-view>. On

Android only, you need to add the flatten={false} attribute to sticky nodes.

The direct child nodes of <scroll-view> only support linear and sticky. If you need more complex layouts, such as child nodes adapting to expand, it is recommended to provide a single child view to the <scroll-view> and implement more robust CSS capabilities within that single child node.

<scroll-view> scroll-y>
  <view> // do anything you want
  {...}
  </view>
</scroll-view>

Attributes

bounces

iOS only
Clay only
Harmony only
1.4
// @defaultValue: true
bounces?: boolean;

Enable bounce effect

enable-scroll

Android only
iOS only
Clay only
Harmony only
1.4
// @defaultValue: true
'enable-scroll'?: boolean;

Enable dragging

initial-scroll-offset

Android only
iOS only
Clay only
Harmony only
2.17
// @defaultValue: 0
'initial-scroll-offset'?: number;

Initial scroll position, only effective once, in PX

initial-scroll-to-index

Android only
iOS only
Clay only
Harmony only
2.17
// @defaultValue: 0
'initial-scroll-to-index'?: number;

Scroll to specified child node on first screen, only effective once. All direct child nodes must be flatten=false.

lower-threshold

Android only
iOS only
Clay only
Harmony only
1.4
// @defaultValue: 0
'lower-threshold'?: number;

Set upper threshold to bindscrolltoupper event.

scroll-bar-enable

iOS only
Clay only
Harmony only
1.4
// @defaultValue: true
'scroll-bar-enable'?: boolean;

Enable scrollbar

scroll-orientation

Android only
iOS only
Clay only
Harmony only
3.0
// @defaultValue: 'vertical'
'scroll-orientation'?: 'vertical' | 'horizontal';

Replacement of scroll-x and scroll-y

upper-threshold

Android only
iOS only
Clay only
Harmony only
1.4
// @defaultValue: 0
'upper-threshold'?: number;

Set upper threshold to bindscrolltoupper event.

Events

Frontend can bind corresponding event callbacks to listen for runtime behaviors of the element, as shown below.

bindcontentsizechanged

Android only
iOS only
Harmony only
1.6
bindcontentsizechanged = (e: ContentSizeChangedEvent) => {};

This event is triggered when the scrollview's content size changed.

bindscroll

Android only
iOS only
Clay only
Harmony only
1.4
bindscroll = (e: ScrollEvent) => {};

This event is triggered when the scrollview is scrolling.

bindscrollend

Android only
iOS only
Clay only
Harmony only
1.6
bindscrollend = (e: ScrollEndEvent) => {};

This event is triggered when the scrollview's scroll ended.

bindscrolltolower

Android only
iOS only
Harmony only
1.4
bindscrolltolower = (e: ScrollToLowerEvent) => {};

This event is triggered when the lower/right edge of the scrolling area intersects with the visible area defined by the lowerThreshold.

bindscrolltoupper

Android only
iOS only
Harmony only
1.4
bindscrolltoupper = (e: ScrollToUpperEvent) => {};

This event is triggered when the upper/left edge of the scrolling area intersects with the visible area defined by the upperThreshold.

Methods

Frontend can invoke component methods via the SelectorQuery API.

autoScroll

Android only
iOS only
Clay only
Harmony only

lynx.createSelectorQuery()
.select('#id')
.invoke({
method: 'autoScroll',
params: {
/**
_ The distance of each second's scrolling, which supports positive and negative values. The unit of distance can be "px", "rpx", "ppx", or null (for iOS, the value must be greater than 1/screen.scale px).
_ @Android
_ @iOS
_ @Harmony
_ @PC
_/
rate: number;
/**
_ Start/stop automatic scrolling.
_ @Android
_ @iOS
_ @Harmony
_ @PC
_/
start: boolean;
};
success: function (res) {},
fail: function (res) {},
})
.exec();

Automatic scrolling

scrollBy

Android only
iOS only
Clay only
Harmony only

lynx.createSelectorQuery()
     .select('#id')
     .invoke({
      method: 'scrollBy',
      params: {
        /**
         * Offset to scroll
         */
        offset?: number;
      };
      success: function (res) {},
      fail: function (res) {},
    })
    .exec();

Scroll by specified offset

scrollTo

Android only
iOS only
Clay only
Harmony only

lynx.createSelectorQuery()
.select('#id')
.invoke({
method: 'scrollTo',
params: {
/**
_ Target item index
_ @defaultValue 0
\*/
index?: number;
/**
_ Offset relative to target node
_/
offset?: number;
/\*\*
_ Enable scroll animation
_/
smooth?: boolean;
};
success: function (res) {},
fail: function (res) {},
})
.exec();

Scroll to specified position

Performance Optimization Suggestions

<scroll-view> creates all of its child nodes at once, potentially causing severe first-screen load times. Use exposure events to drive it to create only visible child nodes.

<scroll-view> lacks any reuse mechanism. If content is too extensive, it may consume an exceptionally large amount of memory, possibly causing OOM and other stability problems.

For data exceeding three screens, use <list> to optimize performance, or simulate <VisualizedList> logic based on exposure events.

Compatibility

LCD tables only load in the browser

Except as otherwise noted, this work is licensed under a Creative Commons Attribution 4.0 International License, and code samples are licensed under the Apache License 2.0.