diff --git a/framework/sky-scrollable.sky b/framework/sky-scrollable.sky index dd22953e5ce..5adc6841d3e 100644 --- a/framework/sky-scrollable.sky +++ b/framework/sky-scrollable.sky @@ -17,11 +17,22 @@ +
@@ -30,6 +41,7 @@ module.exports = class extends SkyElement { created() { this.scrollable_ = null; + this.vbar_ = null; this.scrollOffset_ = 0; this.flingCurve_ = null; this.flingAnimationId_ = null; @@ -37,21 +49,35 @@ module.exports = class extends SkyElement { shadowRootReady() { this.scrollable_ = this.shadowRoot.getElementById('scrollable'); + this.vbar_ = this.shadowRoot.getElementById('vbar'); + } + + get scrollOffset() { + return this.scrollOffset_; + } + + set scrollOffset(value) { + // TODO(abarth): Can we get these values without forcing a synchronous layout? + var outerHeight = this.clientHeight; + var innerHeight = this.scrollable_.clientHeight; + var scrollRange = innerHeight - outerHeight; + var newScrollOffset = Math.max(0, Math.min(scrollRange, value)); + if (newScrollOffset == this.scrollOffset_) + return; + this.scrollOffset_ = newScrollOffset; + var transform = 'translateY(' + -this.scrollOffset_.toFixed(2) + 'px)'; + this.scrollable_.style.transform = transform; + + var topPercent = newScrollOffset / innerHeight * 100; + var heightPercent = outerHeight / innerHeight * 100; + this.vbar_.style.top = topPercent + '%'; + this.vbar_.style.height = heightPercent + '%'; } scrollBy(scrollDelta) { - var scrollHeight = this.scrollable_.clientHeight - this.clientHeight; - var offset = Math.max(0, Math.min(scrollHeight, this.scrollOffset_ + scrollDelta)); - if (offset == this.scrollOffset_) - return false; - this.scrollOffset_ = offset; - this.applyScrollOffset_(); - return true; - } - - applyScrollOffset_() { - var transform = 'translateY(' + -this.scrollOffset_.toFixed(2) + 'px)'; - this.scrollable_.style.transform = transform; + var oldScrollOffset = this.scrollOffset_; + this.scrollOffset += scrollDelta; + return this.scrollOffset_ != oldScrollOffset; } scheduleFlingUpdate_() {