Scrollers
BasicScroller
A BasicScroller
control provides touch-based scrolling for controls placed inside it. Applications will typically create objects of kind Scroller
, which derives directly from BasicScroller
.
A scroller provides a viewport in which the user can drag or flick to scroll content. Note that a user can drag beyond a valid scroll position. When this occurs, the scroller moves with increased tension before returning to a valid position with an accompanying animation.
Note also that the scrolling of content exceeding the size of a viewport is not automatic; for content to scroll, it must be placed inside a scroller control.
Scroll Axes
By default, content scrolls along both the vertical and horizontal axes.
Scrolling in either dimension can be turned on or off. In addition, a scroller can be set to allow scrolling only when content actually exceeds the scroller's dimensions.
By default, the vertical axis always scrolls, whether or not the content exceeds the scroller's height, while the horizontal axis scrolls only if content exceeds the scroller's width.
This behavior--scrolling automatically if the size of the content warrants--is controlled by the autoHorizontal
and autoVertical
properties. By default, autoHorizontal
is set to true
and autoVertical
is set to false
. Setting autoVertical
to true
will cause scrolling along the vertical axis to occur only when the content's height exceeds the scroller's height.
The autoHorizontal
and autoVertical
properties have precedence over the horizontal
and vertical
properties, which both default to true
.
To disable horizontal scrolling, set both the autoHorizontal
and horizontal
properties to false
:
{kind: "Scroller", autoHorizontal: false, horizontal: false}
Scroll Position
Scroll position can be set such that the scroller either snaps to a position directly or animates into the new position.
To set scroll position directly, without animation, set the scrollTop
and scrollLeft
properties:
buttonClick: function() { // don't allow scrolling beyond a left position of 500 if (this.$.scroller.getScrollLeft() > 500) { this.$.scroller.setScrollLeft(500); } }
To set scroll position with animation, use the scrollTo
method:
buttonClick: function() { if (this.$.scroller.getScrollTop() > 100 || this.$.scroller.getScrollLeft() > 300) { this.$.scroller.scrollTo(100, 300); } }
It's also possible to ensure that a given scroll position is visible in a scroller's viewport by calling the scrollIntoView
method. If the scroll position is in view, the scroll position will not change. If not, the scroll position will be set to the given position.
Sizing
A scroller control must have explicit dimensions. If it does not, it will simply expand to fit its content and will not provide scrolling. There are a number of ways to ensure that a scroller's dimensions are set; most commonly, a scroller is placed inside a flex layout and given a flex
value. For example:
{kind: "VFlexLayout", components: [ {kind: "PageHeader", content: "A bunch of info"}, // NOTE: the scroller has flex set to 1 {kind: "Scroller", flex: 1, components: [ {kind: "HtmlContent", srcId: "lotsOfText"} ]}, {kind: "CommandMenu"} ]}
Published Properties
Name | Default | Description |
---|---|---|
scrollTop | 0 | Current scroll position along the vertical axis. |
scrollLeft | 0 | Current scroll position along the horizontal axis. |
autoHorizontal | true | Enables horizontal scrolling only if content exceeds the scroller's width. |
autoVertical | false | Enables vertical scrolling only if content exceeds the scroller's height. |
fpsShowing | false | Display fps counter |
accelerated | true | Use accelerated scrolling |
Published Events
Name | Default | Description |
---|---|---|
onScrollStart | "" | Event that fires when scrolling starts |
onBeforeScroll | "" | Event that fires just before scroll position changes |
onScroll | "" | Event that fires just after scroll position changes |
onScrollStop | "" | Event that fires when scrolling stops |
Methods
getBoundaries()
Returns an object describing the scroll boundaries, which are the dimensions of scrolling content. For example, if getBoundaries returns
{top: 0, left: 0, bottom: 1000, left: 1000}
then the scrolling content is 1000 by 1000.
isScrolling()
Returns true
if the scroller is scrolling when called.
scrollIntoView(inY, inX)
Ensures that the specified position is displayed in the viewport. If the position is not currently in view, the specified position is scrolled to directly, without animation.
scrollTo(inY, inX)
Animates a scroll to the specified position.
scrollToBottom()
Sets the scroll position to the bottom of the content, without animation.
Scroller
In addition to providing all the functionality of a BasicScroller
, enyo.Scroller
ensures that the dimensions of the scroller content are at least as large as the dimensions of the scroller itself.
Since this is typically desirable--it allows a background image to expand to fit the scroller, for one thing--applications should generally create instances of enyo.Scroller
.
The Scroller
kind does not add any additional published properties, published events, or public methods to those inherited from BasicScroller
.
SnapScroller
enyo.SnapScroller
is another scroller variant that derives from BasicScroller
. As one might expect from the name, a snap scroller snaps to the positions of the controls it contains.
When dragged, the scroller moves normally; when a drag is finished, the scroller snaps to the scroll position of the control closest to the dragged position.
Snapping can only occur along one axis at a time. By default, this is the horizontal axis. SnapScroller
has an HFlexLayout
, so its controls are arranged from left to right. Setting the layoutKind
to "VFlexLayout"
will enable vertical snapping. Here's an example:
{kind: "SnapScroller", layoutKind: "VFlexLayout", flex: 1, components: [ {style: "background: red; width: 400px; height: 100px"}, {style: "background: white; width: 400px; height: 100px"}, {style: "background: blue; width: 400px; height: 100px"} ]}